为什么不显示val_loss和val_acc?

时间:2019-04-18 12:46:43

标签: python machine-learning keras

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

2 个答案:

答案 0 :(得分:1)

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

但是,在每个时期之后计算验证损失和准确性将大大减慢您的训练速度,并且对网络性能的评估没有多大作用。

答案 1 :(得分:0)

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

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


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

这并不完全等同,因为样本是从数据中随机抽取的,带有替换,但这是最容易获得的...