Keras是否具有内置方法来输出(和以后绘制)单个时期的训练过程中的损耗演化?
使用函数keras.callbacks.History()的常用方法可以为每个时期输出损失。但是在我的情况下,训练集相当大,因此我将单个时期传递给了NN。由于我想绘制训练期间训练(和开发)损失的演变情况,有没有办法做到这一点?
我目前正在通过以下方式解决此问题:将训练集分为不同的批次,然后在一个时期内依次对每个训练集进行训练,并每次保存模型。但是也许有内置的方法可以做到这一点?
我正在使用TensorFlow后端。
答案 0 :(得分: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
但是,正如您可能会自己看到的那样,这具有严重的缺点,即放慢代码(并适当地发出一些相关的警告)。作为一种折衷方案,如果可以在每次批处理结束时只获得 training 性能,则可以使用略有不同的回调:
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
现在的结果(将callbacks=[TestCallback2((x_test, y_test))
中的model.fit()
替换为)要快得多,但是每批结束时只给出训练指标:
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
[...]
更新
以上所有方法都可以,但由此产生的损失和准确性不会存储在任何地方,因此无法进行绘制;因此,这是另一个回调解决方案,它实际上将指标存储在训练集中:
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[: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 :(得分:0)
livelossplot是训练过程中实时控制丢失的一种好方法,您可以通过pip安装
pip install livelossplot