keras 为什么瓦尔_loss和val_acc不显示?

yrdbyhpb  于 2023-01-09  发布在  其他
关注(0)|答案(4)|浏览(261)

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

lx0bsm1f

lx0bsm1f1#

验证损失和准确度在时段结束时计算,而不是在批处理结束时计算。如果要在每个批处理后计算这些值,则必须使用on_batch_end()方法实现自己的回调,并在验证集上调用self.model.evaluate()。请参见https://keras.io/callbacks/
但是,在每个历元之后计算验证损失和准确性会大大降低训练速度,并且不会带来太多网络性能评估。

wr98u20j

wr98u20j2#

在每次迭代时计算验证指标没有多大意义,因为这会让你的训练过程慢得多,而且你的模型在迭代之间不会有太大变化。另一方面,在每个时期结束时计算这些指标会有更大的意义。
在您的情况下,训练集有50000个样本,验证集有10000个样本,批量大小为32。如果在每次迭代后计算val_lossval_acc,则意味着每更新32个权重的训练样本,将有313个样本(即10000/32)迭代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
    )

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

bxgwgixi

bxgwgixi3#

您应该对y_trainy_test变量使用One hot encodingto_categorical方法。在文本生成nlp问题的模型拟合部分中,我遇到了这个问题。当我对y_testy_validation变量使用to_categorical方法时,验证精度显示出来。

uqxowvwt

uqxowvwt4#

如果批量大小大于验证数据集的最大数量,就会发生这种情况。2简单地降低批量大小就解决了我的问题。

相关问题