Keras 中的序列标记

Rac*_*nog 5 machine-learning deep-learning lstm keras recurrent-neural-network

我正在研究句子标签问题。我自己完成了嵌入和填充,我的输入看起来像:

X_i = [[0,1,1,0,2,3...], [0,1,1,0,2,3...], ..., [0,0,0,0,0...],  [0,0,0,0,0...], ....]
Run Code Online (Sandbox Code Playgroud)

对于句子中的每个单词,我想预测四个类别之一,所以我想要的输出应该是这样的:

Y_i = [[1,0,0,0], [0,0,1,0], [0,1,0,0], ...]
Run Code Online (Sandbox Code Playgroud)

我的简单网络架构是:

model = Sequential()

model.add(LSTM(input_shape = (emb,),input_dim=emb, output_dim=hidden, return_sequences=True))
model.add(TimeDistributedDense(output_dim=4))
model.add(Activation('softmax'))
    model.compile(loss='binary_crossentropy', optimizer='adam')

model.fit(X_train, Y_train, batch_size=32, nb_epoch=3, validation_data=(X_test, Y_test), verbose=1, show_accuracy=True)
Run Code Online (Sandbox Code Playgroud)

它在训练时显示大约 95%,但是当我尝试使用训练有素的模型预测新句子时,结果非常糟糕。看起来模型只是为第一个单词学习了一些类,并且每次都显示它。我认为问题可能是:

  1. 自己写的padding(句末零向量),会不会让学习更糟?

  2. 我应该尝试学习不同长度的句子,没有填充(如果是,你能帮助我如何在 Keras 中训练这种模型吗?)

  3. 错误的学习目标,但我尝试了均方误差,二元交叉熵等,它没有改变。

  4. TimeDistributedDense和 的东西softmax,我想,我已经知道它是如何工作的,但仍然不是 100% 确定。

我很高兴看到有关此问题的任何提示或帮助,谢谢!

Jam*_*mes 1

我个人认为您误解了“序列标记”的含义。

你的意思是:

  1. X是一个句子列表,每个元素X[i]是任意长度的单词序列?
  2. Y[i]是 的类别X[i],并且 的一种热门形式Y[i][0, 1, 0, 0]类似数组?

如果是,那么这不是序列标记问题,而是分类问题。

不要使用TimeDistributedDense,如果是多类分类问题,即 ,len(Y[i]) > 2则使用“ categorical_crossentropy”而不是“ binary_crossentropy