Ami*_*ard 5 machine-learning deep-learning language-model keras tensorflow
我有一组不同长度的非零序列,我使用 Keras LSTM 对这些序列进行建模。我使用 Keras Tokenizer 进行标记化(标记从 1 开始)。为了使序列具有相同的长度,我使用填充。
填充的示例:
# [0,0,0,0,0,10,3]
# [0,0,0,0,10,3,4]
# [0,0,0,10,3,4,5]
# [10,3,4,5,6,9,8]
Run Code Online (Sandbox Code Playgroud)
为了评估模型是否能够泛化,我使用了 70/30 比率的验证集。在每个 epoch 结束时,Keras 都会显示训练和验证的准确性。
我最大的疑问是使用 padding 时Keras 验证准确性是否可靠。因为验证集可以简单地是 0 的序列 --> [0,0,0]。由于有很多 0 的序列(由于填充),模型可以轻松地学习并正确预测 0 的序列,从而创建假的高验证精度。换句话说,模型可能学习零序列,而不学习真实序列。
那么,填充会影响 Keras 中的验证准确性吗?
我知道这个答案为时已晚,但我认为它对其他读者可能有用。
简短的回答是肯定的!填充会影响准确性。
为了处理填充的不良影响,您可以定义新的指标。这个新指标必须忽略与填充相关的类。
本文提出了一种用于词性标注的 BiLSTM 模型作为序列标注任务。忽略类(填充类)的特殊准确度度量被呈现给:
from keras import backend as K
def ignore_class_accuracy(to_ignore=0):
def ignore_accuracy(y_true, y_pred):
y_true_class = K.argmax(y_true, axis=-1)
y_pred_class = K.argmax(y_pred, axis=-1)
ignore_mask = K.cast(K.not_equal(y_pred_class, to_ignore), 'int32')
matches = K.cast(K.equal(y_true_class, y_pred_class), 'int32') * ignore_mask
accuracy = K.sum(matches) / K.maximum(K.sum(ignore_mask), 1)
return accuracy
return ignore_accuracy
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下使用单热标签。最后你可以像这样传递新的准确度:
model.compile(loss='categorical_crossentropy',
optimizer=Adam(0.001),
metrics=['accuracy', ignore_class_accuracy(0)])
Run Code Online (Sandbox Code Playgroud)
在训练模型中,将报告这样的输出(正常准确度为 91%,新的特殊准确度为 81%):
Epoch 1/10 1679/2054 [=======================>......] - ETA: 2:33 -
loss: 0.2901 - accuracy: 0.9147 - ignore_accuracy: 0.8118
Run Code Online (Sandbox Code Playgroud)
小智 0
不,填充绝对不会像你想象的那样产生影响。当你填充时,你会考虑最长的并根据它进行填充,因此即使对于该批次,所有神经元都会产生一些激活,网络也肯定不会学会仅预测 0 序列,因为你从未提供过它们。此外,网络学习更正确地预测 0 以外的值,并且在学习预测其他值的同时学习预测零。我希望我已经消除了您对这一问题的疑虑。
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |