【问题标题】:Why val_loss and val_acc are not displaying?为什么 val_loss 和 val_acc 没有显示?
【发布时间】:2019-09-08 19:29:16
【问题描述】:

训练开始时,运行窗口中只显示loss和acc,缺少val_loss和val_acc。只有在最后,才会显示这些值。

model.add(Flatten())
model.add(Dense(512, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(10, activation="softmax"))

model.compile(
    loss='categorical_crossentropy',
    optimizer="adam",
    metrics=['accuracy']
)

model.fit(
    x_train,
    y_train,
    batch_size=32, 
    epochs=1, 
    validation_data=(x_test, y_test),
    shuffle=True
)

训练是这样开始的:

Train on 50000 samples, validate on 10000 samples
Epoch 1/1

   32/50000 [..............................] - ETA: 34:53 - loss: 2.3528 - acc: 0.0938
   64/50000 [..............................] - ETA: 18:56 - loss: 2.3131 - acc: 0.0938
   96/50000 [..............................] - ETA: 13:45 - loss: 2.3398 - acc: 0.1146

这就是它结束的时候

49984/50000 [============================>.] - ETA: 0s - loss: 1.5317 - acc: 0.4377
50000/50000 [==============================] - 231s 5ms/step - loss: 1.5317 - acc: 0.4378 - val_loss: 1.1503 - val_acc: 0.5951

我想查看每一行的 val_acc 和 val_loss

【问题讨论】:

    标签: python machine-learning keras


    【解决方案1】:

    验证损失和准确性是在 epoch 结束时计算的,而不是在批次结束时计算的。如果您想在每批之后计算这些值,则必须使用 on_batch_end() 方法实现您自己的回调,并在验证集上调用 self.model.evaluate()。见https://keras.io/callbacks/

    但是在每个 epoch 之后计算验证损失和准确率会大大减慢您的训练速度,并且在评估网络性能方面不会带来太大影响。

    【讨论】:

      【解决方案2】:

      在每次迭代中计算验证指标没有多大意义,因为它会使您的训练过程慢得多,而且您的模型在每次迭代中不会发生太大变化。另一方面,在每个 epoch 结束时计算这些指标更有意义。

      在您的情况下,您在训练集上有 50000 个样本,在验证集上有 10000 个样本,批量大小为 32。如果您要在每次迭代后计算 val_lossval_acc,这意味着对于每个32 个训练样本更新您的权重,您将拥有 32 个验证样本的 313 次(即 10000/32)次迭代。由于您的每个 epoch 都包含 1563 次迭代(即 50000/32),因此您必须执行 489219(即 313*1563)仅用于评估模型的批量预测。这会导致您的模型训练慢几个数量级


      如果您仍想在每次迭代结束时计算验证指标(不推荐,原因如上所述),您可以简单地缩短您的“epoch”,以便您的模型只看到 1每个时代的批次:

      model.fit(
          x_train,
          y_train,
          batch_size=32, 
          epochs=len(x_train) // batch_size + 1,  # 1563 in your case
          steps_per_epoch=1, 
          validation_data=(x_test, y_test),
          shuffle=True
          )
      

      这并不完全等效,因为样本将随机抽取,替换,从数据中,但它是你能得到的最简单的......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 2019-11-03
        • 2019-07-03
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 2019-07-21
        相关资源
        最近更新 更多