【问题标题】:Keras, append to logs from callbackKeras,从回调附加到日志
【发布时间】:2018-01-28 16:27:08
【问题描述】:

我有一个回调,它在 on_epoch_end 中为验证数据和每 10 个 epoch 计算测试数据的几个额外指标。

我还有一个CSVLogger 回调,可以将正常指标保存到日志文件中。

我的回调中是否有一种简单的方法可以在CSVLogger 正确写入的日志中添加一两列?

【问题讨论】:

    标签: logging callback keras


    【解决方案1】:

    您可以将其他指标插入字典 logs

    from keras.callbacks import Callback
    
    class ComputeMetrics(Callback):
        def on_epoch_end(self, epoch, logs):
            logs['val_metric'] = epoch ** 2  # replace it with your metrics
            if (epoch + 1) % 10 == 0:
                logs['test_metric'] = epoch ** 3  # same
            else:
                logs['test_metric'] = np.nan
    

    请记住在您的fit 调用中将此回调放在CSVLogger 之前。稍后出现在列表中的回调将收到 logs 的修改版本。例如,

    model = Sequential([Dense(1, input_shape=(10,))])
    model.compile(loss='mse', optimizer='adam')
    model.fit(np.random.rand(100, 10),
              np.random.rand(100),
              epochs=30,
              validation_data=(np.random.rand(100, 10), np.random.rand(100)),
              callbacks=[ComputeMetrics(), CSVLogger('1.log')])
    

    现在,如果您查看输出日志文件,您将看到两个额外的列 test_metricval_metric

    epoch,loss,test_metric,val_loss,val_metric
    0,0.547923130989,nan,0.370979120433,0
    1,0.525437340736,nan,0.35585285902,1
    2,0.501358469725,nan,0.341958616376,4
    3,0.479624577463,nan,0.329370084703,9
    4,0.460121934414,nan,0.317930338383,16
    5,0.440655426979,nan,0.307486981452,25
    6,0.422990380526,nan,0.298160370588,36
    7,0.406809270382,nan,0.289906248748,49
    8,0.3912438941,nan,0.282540213466,64
    9,0.377326357365,729,0.276457450986,81
    10,0.364721306562,nan,0.271435074806,100
    11,0.353612961769,nan,0.266939682364,121
    12,0.343238875866,nan,0.263228923082,144
    13,0.333940329552,nan,0.260326927304,169
    14,0.325931007862,nan,0.25773427248,196
    15,0.317790198028,nan,0.255648627281,225
    16,0.310636150837,nan,0.25411529541,256
    17,0.304091459513,nan,0.252928718328,289
    18,0.298703012466,nan,0.252127869725,324
    19,0.292693507671,6859,0.251701972485,361
    20,0.287824733257,nan,0.251610517502,400
    21,0.283586999774,nan,0.251790778637,441
    22,0.27927801609,nan,0.252100949883,484
    23,0.276239238977,nan,0.252632959485,529
    24,0.273072380424,nan,0.253150621653,576
    25,0.270296501517,nan,0.253555388451,625
    26,0.268056542277,nan,0.254015884399,676
    27,0.266158599854,nan,0.254496408701,729
    28,0.264166412354,nan,0.254723013639,784
    29,0.262506003976,24389,0.255338237286,841
    

    【讨论】:

    • 天哪,你是第一个。恭喜:)
    • 诚然,我自己也可以尝试过:-D 只是想确保“即时”弄乱日志不会扰乱 keras 中的任何内容。也很高兴知道回调的顺序很重要。
    • Ha :) 实际上有两个回调被隐式附加到回调列表中(因此可能会受到影响),HistoryProgbarLogger。但据我所知,他们应该能够处理(或忽略)附加值。
    • 似乎不支持附加不是标量的指标,如混淆矩阵。有没有人找到解决方案?
    • 是什么决定了verbose=1 期间命令行上显示的指标?如果我将一些指标保存到 logs 中并且它们是 numpy 数组,或者不是单个数字怎么办?
    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多