【问题标题】:Trying to get the val_loss from training a model试图从训练模型中获得 val_loss
【发布时间】:2017-10-11 18:14:18
【问题描述】:

我有以下课程,我尝试在其中获取包含每次训练的损失和验证损失的元组列表

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.losses = []

    def on_batch_end(self, batch, logs={}):
        self.losses.append((logs.get('loss'), logs.get('val_loss')))

我在之前初始化了 LossHistory 对象

history = LossHistory()

然后我通过以下方式将它传递给我的模型上的 fit 方法

regressor.fit(X_train, y_train, batch_size=32, epochs=200, validation_split = 0.2, callbacks = [history])

问题是当我尝试获取 history.losses[0][1] 时,返回的值是 noneType,它不应该是

我不知道我在这里做错了什么,我有点卡在这个问题上一段时间了。

【问题讨论】:

  • 我没有看到您将回调传递给 fit 方法。你确定这是正确的路线吗?
  • 我已经通过了,但是忘记放在代码段中,抱歉这个错误
  • 打印整个history.losses 看看它是什么?
  • 我在这里找到了工作stackoverflow.com/questions/39283358/…。但是我仍然不明白我在上面的代码中做错了什么
  • @DanielMöller 我首先打印了它,它是一个元组列表,列表的第一个元素是浮点数,第二个元素是 NoneType

标签: python python-3.x keras theano


【解决方案1】:

我的回答迟了,但可能对其他人有帮助。

on_batch_end 在每批结束时被调用,此时我们没有 val_loss。 val_loss 是在每个 epoch 结束时计算的,而不是在每个批次结束时计算的。 如果您还想在每个批次结束时获得 val_loss,您应该计算它,但请注意它会减慢执行速度。 也许你可以这样做:

你应该在你的类中添加一个 init:

def __init__(self, validation_data):
    self.validation_data = validation_data
    self.val_losses = []

def on_batch_end(self, batch, logs={}):
    x, y = self.validation_data
    val_loss, val_acc = self.model.evaluate(x, y, verbose=0)
    self.val_losses.append(val_loss)
    self.losses.append(logs.get('loss'))

【讨论】:

    猜你喜欢
    • 2019-11-12
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2018-11-03
    • 2019-05-28
    • 2019-06-23
    相关资源
    最近更新 更多