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

标签 tensorflow machine-learning keras deep-learning language-model

我有一组不同长度的非零序列,我正在使用 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]

为了评估模型是否能够泛化,我使用了比例为 70/30 的验证集。在每个纪元结束时,Keras 显示训练和验证的准确性。

我最大的疑问是使用填充时,Keras 验证准确性是否可靠。因为验证集可以只是 0 的序列 --> [0,0,0]。由于有很多 0 的序列(因为填充),模型可以轻松地学习和正确预测 0 的序列,从而创建虚假的高验证精度。换句话说,该模型可能学习零序列而不学习真实序列。

那么,padding 会影响 Keras 中的验证准确性吗?

最佳答案

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

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

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

In this article提出了一个用于词性标注的 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

请注意,在本例中使用的是 one-hot 标签。最后,您可以像这样传递新的准确性:

model.compile(loss='categorical_crossentropy',
              optimizer=Adam(0.001),
              metrics=['accuracy', ignore_class_accuracy(0)])

在训练模型中,将报告这样的输出(正常精度为 91%,新特殊精度为 81%):

Epoch 1/10 1679/2054 [=======================>......] - ETA: 2:33 -
loss: 0.2901 - accuracy: 0.9147 - ignore_accuracy: 0.8118

关于tensorflow - 在序列模型中使用填充时,Keras 验证准确性是否有效/可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62963127/

相关文章:

node.js - 无法使用 npm 安装 @tensorflow/tfjs-node

c++ - 使用tensorflow C++的OpenGL程序对cuInit的调用失败: CUDA_ERROR_OUT_OF_MEMORY

linux - 如何在后台运行 Keras、tensorflow 程序并保留所有日志?

machine-learning - 用于数值转换的机器学习

python - 在单独的线程中从 Tensorflow 模型返回层激活和权重

python - Tensorflow CNN 模型出现错误 "NaN loss during training."

machine-learning - scikit learn 中序数数据和分类数据作为标签的区别

python - 理解 Python 中 Spark MLlib 的 LinearRegressionWithSGD 示例有问题吗?

python - keras - TypeError : 'int' object is not iterable

python - tf.session.run 的网络输出与使用 keras.Model.predict 获得的网络输出有很大不同