Keras中回调和进度条的精度不匹配

Keras中回调和进度条的精度不匹配,keras,Keras,我正在尝试学习Keras,并使用LSTM解决分类问题。我想能够画出 准确度和损失,并在培训期间更新绘图。为此,我正在使用。 由于某些原因,我在回调中收到的准确性和损失与 拟合函数打印的精度和损耗 以下是我的代码的相关行: class PlotCallbacks(Callback): def on_batch_end(self, batch, logs={}): print(logs) return # Create the model model = S

我正在尝试学习Keras,并使用LSTM解决分类问题。我想能够画出 准确度和损失,并在培训期间更新绘图。为此,我正在使用。 由于某些原因,我在回调中收到的准确性和损失与 拟合函数打印的精度和损耗

以下是我的代码的相关行:

class PlotCallbacks(Callback):
    def on_batch_end(self, batch, logs={}):
        print(logs)
        return

# Create the model
model = Sequential()
model.add(Embedding(top_words, embedding_vector_length,input_length=max_conv_length))
model.add(LSTM(300))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, callbacks=[PlotCallbacks()], nb_epoch=1, batch_size=3, verbose=1)
运行程序时,我得到以下输出(每个批次的第一行通过回调打印,第二行通过model.fit打印):

我已尝试打印logs.get('acc'),并将精度保存到PlotCallbacks对象中的列表中,然后打印该列表,但问题仍然存在

有人知道问题出在哪里吗

感谢
on\u batch\u end()
类型回调函数获得刚刚训练的批的准确性。而keras打印的日志是当前时代所有批次的平均值。您可以在日志中轻松地观察到这一点。。假设在前两个批次中,一个精度为
0.0
1.0
,这使得两个批次的总体精度被视为
0.5000
。就是计算平均值的地方


此外,精度作为度量标准通常在不同的历元之间报告,因此您可以将回调更改为\u epoch\u end()

这里是一个简单的回调函数,它以Keras的progbar定义的方式记录精度(当前时代迄今为止看到的所有批次的平均值):


现在脚本已经更新,我认为正确的行是:
    Epoch 1/1
{'acc': 0.0, 'loss': 1.1038421, 'batch': 0, 'size': 3}
 3/25 [==>...........................] - ETA: 27s - loss: 1.1038 - acc: 0.0000e+00   

 {'acc': 1.0, 'loss': 1.0622898, 'batch': 1, 'size': 3}
 6/25 [======>.......................] - ETA: 19s - loss: 1.0831 - acc: 0.5000       

 {'acc': 1.0, 'loss': 0.91526389, 'batch': 2, 'size': 3}
 9/25 [=========>....................] - ETA: 13s - loss: 1.0271 - acc: 0.6667   

 {'acc': 1.0, 'loss': 0.36570337, 'batch': 3, 'size': 3}
12/25 [=============>................] - ETA: 11s - loss: 0.8618 - acc: 0.7500

{'acc': 1.0, 'loss': 0.1433304, 'batch': 4, 'size': 3}
15/25 [=================>............] - ETA: 9s - loss: 0.7181 - acc: 0.8000

{'acc': 1.0, 'loss': 0.041385528, 'batch': 5, 'size': 3}
18/25 [====================>.........] - ETA: 6s - loss: 0.6053 - acc: 0.8333

{'acc': 1.0, 'loss': 0.011424608, 'batch': 6, 'size': 3}
21/25 [========================>.....] - ETA: 3s - loss: 0.5205 - acc: 0.8571

{'acc': 1.0, 'loss': 0.0034991663, 'batch': 7, 'size': 3}
24/25 [===========================>..] - ETA: 1s - loss: 0.4558 - acc: 0.8750

{'acc': 1.0, 'loss': 0.0012318328, 'batch': 8, 'size': 1}
25/25 [==============================] - 26s - loss: 0.4377 - acc: 0.8800    
class AccHistory(Callback):
    def on_train_begin(self, logs={}):
        self.accs = []
        self.acc_avg = []

    def on_batch_end(self, batch, logs={}):
        self.accs.append(round(1e2*float(logs.get('acc')),4))
        self.acc_avg.append(round(np.mean(self.accs,dtype=np.float64),4))

    def on_epoch_end(self, batch, logs={}):
        self.accs = []