训练开始时,在运行窗口中只显示loss和acc,瓦尔_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
我希望看到每行中的瓦尔_acc和val_loss
4条答案
按热度按时间lx0bsm1f1#
验证损失和准确度在时段结束时计算,而不是在批处理结束时计算。如果要在每个批处理后计算这些值,则必须使用
on_batch_end()
方法实现自己的回调,并在验证集上调用self.model.evaluate()
。请参见https://keras.io/callbacks/。但是,在每个历元之后计算验证损失和准确性会大大降低训练速度,并且不会带来太多网络性能评估。
wr98u20j2#
在每次迭代时计算验证指标没有多大意义,因为这会让你的训练过程慢得多,而且你的模型在迭代之间不会有太大变化。另一方面,在每个时期结束时计算这些指标会有更大的意义。
在您的情况下,训练集有50000个样本,验证集有10000个样本,批量大小为32。如果在每次迭代后计算
val_loss
和val_acc
,则意味着每更新32个权重的训练样本,将有313个样本(即10000/32)迭代32个验证样本。由于每个时期包含1563次迭代(即50000/32),你必须执行489219(即313*1563)批次预测仅用于评估模型。这将导致模型训练慢几个数量级!如果您仍然希望在每次迭代结束时计算验证指标(不推荐,原因如上所述),您可以简单地缩短您的“时期”,以便您的模型在每个时期只看到1个批次:
这并不完全等同,因为样本将从数据中随机抽取,替换,但这是您可以获得的最简单的...
bxgwgixi3#
您应该对
y_train
和y_test
变量使用One hot encoding
或to_categorical
方法。在文本生成nlp问题的模型拟合部分中,我遇到了这个问题。当我对y_test
和y_validation
变量使用to_categorical
方法时,验证精度显示出来。uqxowvwt4#
如果批量大小大于验证数据集的最大数量,就会发生这种情况。2简单地降低批量大小就解决了我的问题。