训练开始时,在运行窗口中仅显示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
答案 0 :(得分:1)
验证损失和准确性是在时期末而不是批次末计算的。如果要在每次批处理之后计算这些值,则必须使用on_batch_end()
方法实现自己的回调,并在验证集上调用self.model.evaluate()
。参见https://keras.io/callbacks/。
但是,在每个时期之后计算验证损失和准确性将大大减慢您的训练速度,并且对网络性能的评估没有多大作用。
答案 1 :(得分:0)
在每次迭代中计算验证指标都没有多大意义,因为这会使您的训练过程慢得多,并且您的模型在迭代之间的变化不会太大。另一方面,在每个时期结束时计算这些指标更有意义。
在您的情况下,训练集上有50000个样本,验证集上有10000个样本,批处理大小为32。如果要在每次迭代后计算val_loss
和val_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
)
这并不完全等同,因为样本是从数据中随机抽取的,带有替换,但这是最容易获得的...