Keras是否有一个内置的方法来输出(以及后来的绘图)在单个时代的训练过程中的损失演变?
通常使用函数keras.callbacks.History()的方法可以输出每个时期的损失。然而,在我的例子中,训练集相当大,因此我要将一个时代传递给NN。既然我想画出训练过程中训练(和开发)损失的演变过程,有什么方法可以做到吗?
我目前正在解决这个问题,方法是将训练集划分成不同的批次,然后在每一个阶段上依次进行训练,每次都保存模型。但也许有一种内置的方式来做这件事?
我正在使用TensorFlow后端。
发布于 2018-09-06 14:26:10
为此,您可以使用回调。
使用Keras MNIST CNN实例 (此处不复制整个代码),并进行以下更改/添加:
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()中替换了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]发布于 2019-10-23 15:29:44
在训练过程中,一个很好的实时控制损失的方法就是生动图,你可以通过pip安装。
pip install livelossplot

https://stackoverflow.com/questions/52205315
复制相似问题