机器学习 – Keras中的序列标记

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

X_i = [[0,1,1,0,2,3...], [0,1,1,0,2,3...], ..., [0,0,0,0,0...],  [0,0,0,0,0...], ....]

对于句子中的每个单词,我想预测四个类中的一个,所以我想要的输出应该如下:

Y_i = [[1,0,0,0], [0,0,1,0], [0,1,0,0], ...]

我简单的网络架构是:

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)

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

>由我自己写的填充(句子末尾的零向量),它会使学习变得更糟吗?
>我应该尝试学习不同长度的句子,没有填充(如果是的话,你能帮助我在Keras训练这种模型吗?)
>错误的学习目标,但我尝试了均方误差,二进制交叉熵等,它没有改变.
>我认为,TimeDistributedDense和softmax的东西,我已经知道它是如何工作的,但仍然不是100%肯定.

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

最佳答案 我个人认为你误解了“序列标签”的含义.

你的意思是:

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

如果是,那么它不是序列标签问题,这是一个分类问题.

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

点赞