首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >喀拉斯地区单个时期的地块损失演化

喀拉斯地区单个时期的地块损失演化
EN

Stack Overflow用户
提问于 2018-09-06 13:35:06
回答 2查看 4.4K关注 0票数 8

Keras是否有一个内置的方法来输出(以及后来的绘图)在单个时代的训练过程中的损失演变?

通常使用函数keras.callbacks.History()的方法可以输出每个时期的损失。然而,在我的例子中,训练集相当大,因此我要将一个时代传递给NN。既然我想画出训练过程中训练(和开发)损失的演变过程,有什么方法可以做到吗?

我目前正在解决这个问题,方法是将训练集划分成不同的批次,然后在每一个阶段上依次进行训练,每次都保存模型。但也许有一种内置的方式来做这件事?

我正在使用TensorFlow后端。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-06 14:26:10

为此,您可以使用回调。

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

代码语言:javascript
复制
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))]
         )

在评估每个批处理结束上的测试/验证集时,我们得到如下信息:

代码语言:javascript
复制
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

但是,您可能会看到,这有一个严重的缺点,即显着地减慢了代码(并相应地产生了一些相关的警告)。作为折衷,如果您只同意在每个批的末尾获得培训性能,则可以使用稍微不同的回调:

代码语言:javascript
复制
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())要快得多,但只给出了每一批结束时的培训指标:

代码语言:javascript
复制
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
  [...]

更新

以上所有内容都可能很好,但所产生的损失和准确性并不存储在任何地方,因此无法绘制它们;因此,下面是另一个回调解决方案,它实际上将度量存储在培训集上:

代码语言:javascript
复制
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个条目:

代码语言:javascript
复制
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]
票数 14
EN

Stack Overflow用户

发布于 2019-10-23 15:29:44

在训练过程中,一个很好的实时控制损失的方法就是生动图,你可以通过pip安装。

代码语言:javascript
复制
pip install livelossplot

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52205315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档