Keras 记录每批训练和测试的损失和准确性

Zig*_*bra 6 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))
Run Code Online (Sandbox Code Playgroud)

要使用回调:

histories = my_callbacks.Histories((x_test, y_test))
model.fit(x_train_reduced, y_train_reduced, batch_size, epochs, verbose=1, callbacks=[histories])
Run Code Online (Sandbox Code Playgroud)

小智 2

我也有同样的问题。每次计算批次的梯度后,我都需要计算验证集和集合的损失。

Keras API 中有一些值得注意的参数:

steps_per_epoch, validation_steps
Run Code Online (Sandbox Code Playgroud)

他们分别设定了时代和验证的例子数量。因此,我想将 epoch 的大小设置为 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'))
Run Code Online (Sandbox Code Playgroud)

关于这个错误我写在这里。到目前为止我正在等待答案。但我有一个问题仍然需要解决。

由于这个问题没有简单的答案,所以有必要粗暴地回答。对此,可以参考班级成员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]))
Run Code Online (Sandbox Code Playgroud)

pslogs.get( val_loss)是在每个纪元之后考虑的。就这一点而言,在它身上,第一批第一纪元就将存在None