Keras记录了每批次的列车损失和准确性

时间:2017-11-24 20:21:35

标签: keras

我正在使用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])

1 个答案:

答案 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>