【问题标题】:Sequence labeling in KerasKeras 中的序列标记
【发布时间】:2016-01-23 17:36:27
【问题描述】:

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

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%,但是当我尝试使用经过训练的模型预测新句子时,结果真的很糟糕。看起来模型刚刚学习了一些关于第一个单词的类,并且每次都显示出来。我认为问题可以是:

  1. 自己写的padding(句尾零向量),会不会让学习变差?

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

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

  4. TimeDistributedDensesoftmax 的东西,我想,我知道它是如何工作的,但仍然不能 100% 确定。

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

【问题讨论】:

  • 你在你的 lstms 上试过 dropout 吗?另外,你试过 lstm 批量标准化
  • 因为你有非常高的训练集学习率,你可以做高 dropout 来做正则化
  • 然后可能尝试多层 lstm
  • 我有一个问题!您是否从 word2vec 模型中获得了输入?我的意思是您在 X_i 中显示的每个子列表,例如 [0,1,1,0,2,3...] 是一个单词的向量表示?我需要这个问题的快速回复!

标签: machine-learning deep-learning keras lstm recurrent-neural-network


【解决方案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

【讨论】:

  • 我可以知道您对为什么它不是序列标记问题的观点吗?我有同样的挑战,输入是单词序列,我需要每个单词的标签。这不是序列标签问题吗?
猜你喜欢
  • 2016-09-15
  • 2018-06-27
  • 2018-10-15
  • 2018-11-10
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多