Keras报告的准确性与model.predict()不对应

时间:2018-12-17 19:36:42

标签: tensorflow machine-learning keras deep-learning

我代码的相关部分:

模型架构:

Sequential(
    layers=[
        BatchNormalization(input_shape=input_shape),
        LSTM(lstm_1, return_sequences=True, dropout=dropout_1),
        BatchNormalization(),
        LSTM(lstm_2, dropout=dropout_2),
        Dense(1, activation='sigmoid')
    ]
)

编译并拟合调用:

model.compile(loss='binary_crossentropy',
                            optimizer=RMSprop(0.0005),
                            metrics=['accuracy'])

model.fit(np.stack(data_train['spectrogram']), np.stack(data_train['label']),
          batch_size=512,
          epochs=50,
          validation_data=(np.stack(data_test['spectrogram']), np.stack(data_test['label'].values)))

训练时

Epoch 50/50
466/466 [==============================] - 4s 8ms/step - loss: 0.5264 - acc: 0.7425 - val_loss: 0.8254 - val_acc: 0.5339

但是当我这样做

train_preds = np.round(model.predict(np.stack(data_train['spectrogram']))).astype('int32')

train_preds的准确度约为55%,但是,如上所示,在最后一个时期报告的准确度为0.7425

我做错什么了吗?还是有一些解释?

如果有帮助,我很乐意发布更多代码。

3 个答案:

答案 0 :(得分:1)

时期中显示的准确性是您提供的训练数据集上模型的准确性model.predict 显示验证数据集的准确性 0.7准确性在训练数据集上,而 0.55准确性在测试/验证数据集上

答案 1 :(得分:0)

您的74%位于训练集上,这表明自己在训练过程中正在执行算法,永远不要把它当作参考。

您应该始终查看您的测试集,这才是真正的价值所在。

更重要的是,您的准确度应始终如下所示(至少是样式):

例如训练集的准确性一直在增长,而测试集遵循相同的趋势但低于训练曲线。

enter image description here

答案 2 :(得分:0)

当训练准确度/损失但开发/测试准确度/损失时,显然会给出过度拟合的信号。如果绘制训练和测试数据的准确性,则可能与下图类似:

enter image description here

在图中的某个点,训练精度会降低,但测试精度不会降低。 该怎么办

  1. 早停
  2. 正规化
  3. 训练更多数据
  4. 简化模型(减少参数)

线索:根据您的代码,您有两个LSTM和466培训示例。 LSTM模型是一个相对强大的网络,可以轻松地对数据进行过拟合。减小LSTM的隐藏层大小或删除其中之一可能是避免过度拟合的良好起点。