6

训练开始时,运行窗口中只显示 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

4

2 回答 2

3

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

但是在每个 epoch 之后计算验证损失和准确性会大大减慢你的训练速度,并且在评估网络性能方面并没有带来太多好处。

于 2019-04-18T13:00:25.917 回答
2

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

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


如果您仍想在每次迭代结束时计算验证指标(由于上述原因不推荐),您可以简单地缩短您的“epoch”,以便您的模型每个 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
    )

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

于 2019-04-18T13:11:56.610 回答