我正在使用Keras训练cnn,我需要记录每批的准确性和损失。有没有办法保存统计数据?以下是我使用的代码,但准确度为none
。此外,回调似乎是抑制进度条。
class Histories(keras.callbacks.Callback):
def __init__(self, test_data):
self.test_data = test_data
def on_train_begin(self, logs={}):
self.train_acc = []
self.test_acc = []
self.train_loss = []
self.test_loss = []
def on_batch_end(self, batch, logs={}):
train_loss_batch = logs.get('loss')
train_acc_batch = logs.get('accuracy')
self.train_loss.append(train_loss_batch)
self.train_acc.append(train_acc_batch)
print('\nTrain loss: {}, acc: {}\n'.format(train_loss_batch, train_acc_batch))
x, y = self.test_data
test_loss_batch, test_acc_batch = self.model.evaluate(x, y, verbose=0)
self.test_loss.append(test_loss_batch)
self.test_acc.append(test_acc_batch)
print('\nTesting loss: {}, acc: {}\n'.format(test_loss_batch, test_acc_batch))
使用回调:
histories = my_callbacks.Histories((x_test, y_test))
model.fit(x_train_reduced, y_train_reduced, batch_size, epochs, verbose=1, callbacks=[histories])
答案 0 :(得分:1)
我有同样的问题。在计算批次上的梯度后,我每次都需要计算验证集和集合集的损失。
在Keras API中有非常重要的参数:
steps_per_epoch, validation_steps
他们分别设定了时代和验证的例子数量。所以,我想在20个例子中设置纪元的大小,从而人为地将其等同于batch_size
的大小。之后我创建了一个callback
,每次批处理完成后都会处理它:
class LossHistory(Callback):
def __init__(self):
super(Callback, self).__init__()
self.losses = []
self.val_losses = []
def on_train_begin(self, logs=None):
self.losses = []
self.val_losses = []
def on_batch_end(self, batch, logs=None):
self.losses.append(logs.get('loss'))
self.val_losses.append(logs.get('val_loss'))
关于这个错误,我写了here。到目前为止,我正在等待答案。但我有一个问题仍然需要解决方案。
由于这个问题没有简单的答案,所以有必要克服。为此,您可以引用班级Callback
的成员。这里有验证集,您可以在其上进行测试。这是以这种方式完成的:
class LossHistory(Callback):
def __init__(self):
super(Callback, self).__init__()
self.losses = []
self.val_losses = []
def on_train_begin(self, logs=None):
self.losses = []
self.val_losses = []
def on_batch_end(self, batch, logs=None):
self.losses.append(logs.get('loss'))
self.val_losses.append(self.model.evaluate(self.validation_data[0], self.validation_data[1]))
P.S。每个时代之后都会考虑logs.get(val_loss
)。在这方面,在第一批时代的第一批将None
。{/ p>