Keras是否有内置的方法来输出(以及后来绘制)单个时期训练期间的损失演变?
使用函数keras.callbacks.History()的常用方法可以为每个纪元输出损失 . 但是在我的情况下,训练集相当大,因此我将一个时期传递给NN . 由于我想描绘训练期间训练(和开发)损失的演变,有没有办法做到这一点?
我目前正在通过将训练集分成不同的批次来解决这个问题,然后用单个时期依次训练每个训练集并且每次都保存模型 . 但也许有内置的方法来做到这一点?
我正在使用TensorFlow后端 .
您可以为此目的使用回调 .
使用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)) )要快得多,但在每个批次结束时仅提供培训指标:
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.losses 和 histories.accuracies 中 - 以下是每个批次的前5个条目:
histories.losses
histories.accuracies
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]
1 回答
您可以为此目的使用回调 .
使用Keras MNIST CNN example(此处不复制整个代码),并进行以下更改/添加:
为了评估每个批次结束时的测试/验证集,我们得到:
但是,正如您自己可能会看到的那样,这显然具有严重的代码(并且适当地产生一些相关警告) . 作为妥协,如果您只在每批结束时获得培训性能,则可以使用稍微不同的回调:
现在的结果(在
model.fit()
中替换callbacks=[TestCallback2((x_test, y_test))
)要快得多,但在每个批次结束时仅提供培训指标:UPDATE
以上所有情况都可以,但由此产生的损失和精度不会存储在任何地方,因此无法绘制;所以,这是另一个回调解决方案,它实际上将指标存储在训练集上:
这导致培训期间每批次结束时的指标分别存储在
histories.losses
和histories.accuracies
中 - 以下是每个批次的前5个条目: