【问题标题】:Training and evaluating accuracies different in keras LSTM model: why does evaluation not produce same results as during training?keras LSTM 模型中的训练和评估精度不同:为什么评估产生的结果与训练期间不同?
【发布时间】:2019-03-15 21:28:05
【问题描述】:

我们正在构建一个 LSTM,用于对物理光学过程进行建模。

到目前为止,我已经使用带有 Tensorflow 后端的 Keras 在 python 中生成了以下代码。

#Define model
model = Sequential()
model.add(LSTM(128, batch_size=BATCH_SIZE, input_shape=(train_x.shape[1],train_x.shape[2]), return_sequences=True, stateful=False ))#,,return_sequences=Tru# stateful=True 
model.add(Dense(2, activation='softmax'))
opt = tf.keras.optimizers.Adam(lr=0.01, decay=1e-6)

#Compile model
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy']
)

model.fit(
    train_x, train_y,
    batch_size=BATCH_SIZE,
    epochs=EPOCHS,#,
    verbose=1)

#Now I want to make sure that the we can predict the training set (using evaluate) and that it is the same result as during training
score = model.evaluate(train_x, train_y, batch_size=BATCH_SIZE, verbose=0)
print(' Train accuracy:', score[1])

代码的输出是

Epoch 1/10 5872/5872 [==============================] - 0s 81us/sample - loss: 0.6954 - acc: 0.4997
Epoch 2/10 5872/5872 [==============================] - 0s 13us/sample - loss: 0.6924 - acc: 0.5229 
Epoch 3/10 5872/5872 [==============================] - 0s 14us/sample - loss: 0.6910 - acc: 0.5256
Epoch 4/10 5872/5872 [==============================] - 0s 13us/sample - loss: 0.6906 - acc: 0.5243 
Epoch 5/10 5872/5872 [==============================] - 0s 13us/sample - loss: 0.6908 - acc: 0.5238

Train accuracy: 0.52480716

所以问题是最终的建模精度(0.5238)应该等于(评估)精度(0.52480716),但事实并非如此。我在这里做错了什么非常感谢任何帮助

【问题讨论】:

    标签: python validation keras lstm


    【解决方案1】:

    “因为你的模型随着时间的推移而变化,所以一个 epoch 的第一批的损失通常高于最后一批。”

    https://keras.io/getting-started/faq/#why-is-the-training-loss-much-higher-than-the-testing-loss

    对于评估,由于采用的是训练好的模型,所以准确率更高。

    【讨论】:

    • 谢谢你。但我使用单批次,请记住我是根据训练数据而不是测试数据评估模型。因此,估计评估期间的训练数据应该给出与“训练期间”相同的结果。
    • 是的,我看到您在这两种情况下都使用了训练数据。不同之处在于训练期间和训练后的模型权重不同。
    • 谢谢,但我不明白这一点。为什么它们不同?在 epoch 5(这是最后一个 epoch 和最终模型)结束时,该模型应该对应于评估。验证集(未显示)也是如此。训练期间的验证准确度与评估后不同。请注意,没有 dropout 可以在训练和评估/预测之间引入不同。如果是这种情况,那么一旦我们开发了一个模型,我们就不能指望我们在 keras 中的模型准确性。我确定我错过了一个概念,你能详细说明吗?非常感谢
    • 如果在训练期间向 model.fit() 提供了验证数据(与 train_x,train_y 相同),那么第 5 轮结束时的验证损失/准确度将与模型的输出相同。评估。
    【解决方案2】:

    谢谢 如下图,不是,这个我没看懂

    model = Sequential()
    model.add(LSTM(32, batch_size=BATCH_SIZE, input_shape=(train_x.shape[1],train_x.shape[2]), return_sequences=True, stateful=False ))#,,return_sequences=Tru# stateful=True 
    model.add(Dense(2, activation='softmax'))
    opt = tf.keras.optimizers.Adam(lr=0.01, decay=1e-6)
    
    #Compile model
    model.compile(
        loss='sparse_categorical_crossentropy',
        optimizer=opt,
        metrics=['accuracy']
    )
    
    #Train model
    model.fit(
        train_x, train_y,
        batch_size=BATCH_SIZE,
        epochs=EPOCHS,
        verbose=1,
        shuffle=False,
        validation_data=(validation_x, validation_y)]
    )
    
    score = model.evaluate(validation_x, validation_y, batch_size=BATCH_SIZE, verbose=0)
    
    print(' Validation accuracy:', score[1])
    

    输出

     Epoch 1/5 5872/5872 [==============================] - 3s 554us/sample - loss: 0.6923 - acc: 0.5154 - val_loss: 0.7149 - val_acc: 0.4668
     Epoch 2/5 5872/5872 [==============================] - 2s 406us/sample - loss: 0.6895 - acc: 0.4983 - val_loss: 0.7218 - val_acc: 0.4821
     Epoch 3/5 5872/5872 [==============================] - 2s 404us/sample - loss: 0.6890 - acc: 0.4940 - val_loss: 0.7230 - val_acc: 0.4821
     Epoch 4/5 5872/5872 [==============================] - 2s 406us/sample - loss: 0.6883 - acc: 0.4928 - val_loss: 0.7336 - val_acc: 0.4592
     Epoch 5/5 5872/5872 [==============================] - 2s 404us/sample - loss: 0.6881 - acc: 0.4934 - val_loss: 0.7278 - val_acc: 0.4745
    
     Validation accuracy: 0.45663264
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2020-04-25
      • 1970-01-01
      相关资源
      最近更新 更多