首页 文章

在Keras的单个时期绘制损失演变

提问于
浏览
2

Keras是否有内置的方法来输出(以及后来绘制)单个时期训练期间的损失演变?

使用函数keras.callbacks.History()的常用方法可以为每个纪元输出损失 . 但是在我的情况下,训练集相当大,因此我将一个时期传递给NN . 由于我想描绘训练期间训练(和开发)损失的演变,有没有办法做到这一点?

我目前正在通过将训练集分成不同的批次来解决这个问题,然后用单个时期依次训练每个训练集并且每次都保存模型 . 但也许有内置的方法来做到这一点?

我正在使用TensorFlow后端 .

1 回答

  • 4

    您可以为此目的使用回调 .

    使用Keras MNIST CNN example(此处不复制整个代码),并进行以下更改/添加:

    from keras.callbacks import Callback
    
    class TestCallback(Callback):
        def __init__(self, test_data):
            self.test_data = test_data
    
        def on_batch_end(self, batch, logs={}):
            x, y = self.test_data
            loss, acc = self.model.evaluate(x, y, verbose=0)
            print('\nTesting loss: {}, acc: {}\n'.format(loss, acc))
    
    model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=1,
              verbose=1,
              validation_data=(x_test, y_test),
              callbacks=[TestCallback((x_test, y_test))]
             )
    

    为了评估每个批次结束时的测试/验证集,我们得到:

    Train on 60000 samples, validate on 10000 samples
    Epoch 1/1
    
    Testing loss: 0.0672039743446745, acc: 0.9781
    
      128/60000 [..............................] - ETA: 7484s - loss: 0.1450 - acc: 0.9531
    
    /var/venv/DSTL/lib/python3.4/site-packages/keras/callbacks.py:120: UserWarning: Method on_batch_end() is slow compared to the batch update (15.416976). Check your callbacks.
      % delta_t_median)
    
    
    Testing loss: 0.06644540682602673, acc: 0.9781
    
      256/60000 [..............................] - ETA: 7476s - loss: 0.1187 - acc: 0.9570
    
    /var/venv/DSTL/lib/python3.4/site-packages/keras/callbacks.py:120: UserWarning: Method on_batch_end() is slow compared to the batch update (15.450395). Check your callbacks.
      % delta_t_median)
    
    
    Testing loss: 0.06575664376271889, acc: 0.9782
    

    但是,正如您自己可能会看到的那样,这显然具有严重的代码(并且适当地产生一些相关警告) . 作为妥协,如果您只在每批结束时获得培训性能,则可以使用稍微不同的回调:

    class TestCallback2(Callback):
        def __init__(self, test_data):
            self.test_data = test_data
    
        def on_batch_end(self, batch, logs={}):
            print()  # just a dummy print command
    

    现在的结果(在 model.fit() 中替换 callbacks=[TestCallback2((x_test, y_test)) )要快得多,但在每个批次结束时仅提供培训指标:

    Train on 60000 samples, validate on 10000 samples
    Epoch 1/1
    
      128/60000 [..............................] - ETA: 346s - loss: 0.8503 - acc: 0.7188
      256/60000 [..............................] - ETA: 355s - loss: 0.8496 - acc: 0.7109
      384/60000 [..............................] - ETA: 339s - loss: 0.7718 - acc: 0.7396
      [...]
    

    UPDATE

    以上所有情况都可以,但由此产生的损失和精度不会存储在任何地方,因此无法绘制;所以,这是另一个回调解决方案,它实际上将指标存储在训练集上:

    from keras.callbacks import Callback
    
    class Histories(Callback):
    
        def on_train_begin(self,logs={}):
            self.losses = []
            self.accuracies = []
    
        def on_batch_end(self, batch, logs={}):
            self.losses.append(logs.get('loss'))
            self.accuracies.append(logs.get('acc'))
    
    
    histories = Histories()
    
    model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=1,
              verbose=1,
              validation_data=(x_test, y_test),
              callbacks=[histories]
             )
    

    这导致培训期间每批次结束时的指标分别存储在 histories.losseshistories.accuracies 中 - 以下是每个批次的前5个条目:

    histories.losses[:5]
    # [2.3115866, 2.3008101, 2.2479887, 2.1895032, 2.1491694]
    
    histories.accuracies[:5]
    # [0.0703125, 0.1484375, 0.1875, 0.296875, 0.359375]
    

相关问题