【问题标题】:How to record val_loss and loss per batch in keras如何在keras中记录每批的val_loss和loss
【发布时间】:2017-07-12 13:24:17
【问题描述】:

我正在使用 keras 中的回调函数来记录每个时期的 lossval_loss,但我想按批次做同样的事情。找到了一个叫on_batch_begin(self,batch,log={})的回调函数,但是不知道怎么用。

【问题讨论】:

  • 请显示您现在每个时期在做什么,以便我们可以看到您对每批的期望。
  • history = model.fit_generator(...) 然后 history.history['loss'] 和 history.history['val_loss'] 给我们每个时期的损失和 val_loss

标签: python machine-learning neural-network keras


【解决方案1】:

这是自定义回调的示例。跟随并修改here中的一个例子:

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

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

model = Sequential()
model.add(Dense(10, input_dim=784, init='uniform'))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

history = LossHistory()
model.fit(X_train, Y_train, batch_size=128, nb_epoch=20, verbose=0, validation_split=0.1,
          callbacks=[history])

print history.losses
# outputs
'''
[0.66047596406559383, 0.3547245744908703, ..., 0.25953155204159617, 0.25901699725311789]
'''
print history.val_losses

【讨论】:

  • 日志字典似乎没有 'val_loss' 键。因此最终的打印语句总是显示一个空列表
  • 如果您不设置验证数据,那么历史对象中就没有损失值?
  • 我确实设置了验证数据
  • 尝试打印出history.history.keys() 以检查您的统计数据。
【解决方案2】:
import numpy as np
import matplotlib.pyplot as plt
import keras

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.history = {'loss':[],'val_loss':[]}

    def on_batch_end(self, batch, logs={}):
        self.history['loss'].append(logs.get('loss'))

    def on_epoch_end(self, epoch, logs={}):
        self.history['val_loss'].append(logs.get('val_loss'))

history = LossHistory()

model = keras.Sequential()
model.add(keras.layers.Dense(32, activation='relu', input_dim=100))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy')

# Generate dummy data
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))

# Train the model, iterating on the data in batches of 32 samples
model.fit(data, labels, epochs=10, batch_size=32, 
          validation_split=0.2, callbacks=[history])

# Plot the history
y1=history.history['loss']
y2=history.history['val_loss']
x1 = np.arange( len(y1))
k=len(y1)/len(y2)
x2 = np.arange(k,len(y1)+1,k)
fig, ax = plt.subplots()
line1, = ax.plot(x1, y1, label='loss')
line2, = ax.plot(x2, y2, label='val_loss')
plt.show()

【讨论】:

    【解决方案3】:

    从 tf.keras 文档看来 on_batch_end 不包括 val_loss

    on_batch_end:日志包括loss,以及可选的acc (如果启用了准确性监控)。

    这里提到: https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/Callback

    【讨论】:

      【解决方案4】:

      我有一个答案。我能够计算出来。我计算了 manuel LossFunction(Binary Cross Entropy)。因为,如果我使用“model.evaluate(x_test, y_test)”,那么训练阶段需要相当长的时间。

      但是在每个batch结束时,keras用BCE计算和执行时,过程要快很多

       class LossHistory(keras.callbacks.Callback):
              
              def on_train_begin(self, logs={}):
                  self.losses = []
                  self.val_losses= []
          
              def on_batch_end(self, batch, logs={}):
                  y_pred = self.model.predict(x_test_scaled)
                  bce = tf.keras.losses.BinaryCrossentropy(from_logits=False)
                  val_loss = bce(y_test, y_pred).numpy()
                  self.val_losses.append(val_loss)
                  self.losses.append(logs.get('loss'))
      

      它仍然只适合模型。

      hist = LossHistory()
      
      model.compile(optimizer=keras.optimizers.Adam(),
                    loss=keras.losses.binary_crossentropy,
                    metrics=[keras.metrics.binary_crossentropy])
      
      history = model.fit(x_train_scaled, y_train,batch_size=256, epochs=15,
                verbose=1,callbacks=[hist], validation_data=(x_test_scaled, y_test))
      

      在模型拟合结束时,您可以显示每个批次步骤的验证损失。

      hist.val_losses
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-28
        • 2020-07-29
        • 1970-01-01
        • 2018-05-03
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多