在序列模型中使用填充时,Keras 验证准确性有效/可靠吗?

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 中的验证准确性吗?

Ali*_*chi 5

我知道这个答案为时已晚,但我认为它对其他读者可能有用。

简短的回答是肯定的!填充会影响准确性。

为了处理填充的不良影响,您可以定义新的指​​标。这个新指标必须忽略与填充相关的类。

本文提出了一种用于词性标注的 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 以外的值,并且在学习预测其他值的同时学习预测零。我希望我已经消除了您对这一问题的疑虑。