【问题标题】:How to print every x, y pair used during a Tensorflow training model.fit(X, Y)?如何打印在 Tensorflow 训练 model.fit(X, Y) 期间使用的每个 x、y 对?
【发布时间】:2021-09-07 22:57:22
【问题描述】:

我试图调试为什么两个训练操作的行为不同,而我以稍微不同的格式向它们提供相同的数据:一次是numpy.ndarray,另一次是tensorflow.data.Dataset。

记录在训练操作期间输入神经网络的每一对x、y 会有所帮助:

model.fit(X, Y, ...)  # X, Y and numpy ndarrays
model.fit(ds, ...)    # ds is a tensorflow.data.Dataset

问题:如何让 Tensorflow 记录训练期间使用的每一对输入/目标?(无论是在 numpy ndarray 还是 tensorflow Dataset 案例中)


注意:我已经研究过像How can I output some data during a model.fit() run in tensorflow? 中那样自定义tf.keras.callbacks.Callback,但不幸的是on_train_batch_begin 方法并没有公开实际的批处理数据/训练数据本身。

【问题讨论】:

    标签: python numpy tensorflow keras numpy-ndarray


    【解决方案1】:

    您可以为此目的覆盖train_step。

    示例代码:

    class printeverybatch(tf.keras.Model):
        def train_step(self, data):
            x, y = data
            tf.print('new batch:')
            tf.print(x,summarize=-1)
            tf.print(y,summarize=-1)
            return super().train_step(data)
    
    tf.random.set_seed(88883)
    np.random.seed(88883)
    
    inputs=tf.keras.Input((5,))
    model=printeverybatch(inputs,tf.keras.layers.Dense(1)(inputs))
    
    x=np.random.rand(4,5)
    y=np.random.rand(4,1)
    model.compile(loss=tf.keras.losses.MeanSquaredError(),
                  optimizer=tf.keras.optimizers.SGD())
    model.fit(x,y,batch_size=2,verbose=2,epochs=2)
    '''
    Epoch 1/2
    new batch:
    [[0.227194726 0.271517038 0.27261427 0.577692807 0.100502096]
     [0.535813034 0.298211783 0.669178188 0.989641547 0.383945227]]
    [[0.392579]
     [0.275484771]]
    new batch:
    [[0.494236499 0.969957471 0.500168502 0.537253439 0.768969536]
     [0.243241057 0.0589612834 0.78992331 0.718339801 0.0696426481]]
    [[0.20291324]
     [0.497432947]]
    2/2 - 0s - loss: 1.2453
    Epoch 2/2
    new batch:
    [[0.535813034 0.298211783 0.669178188 0.989641547 0.383945227]
     [0.243241057 0.0589612834 0.78992331 0.718339801 0.0696426481]]
    [[0.275484771]
     [0.497432947]]
    new batch:
    [[0.494236499 0.969957471 0.500168502 0.537253439 0.768969536]
     [0.227194726 0.271517038 0.27261427 0.577692807 0.100502096]]
    [[0.20291324]
     [0.392579]]
    2/2 - 0s - loss: 1.0387
    '''
    

    它适用于numpy.ndarray 和tensorflow.data.Dataset。

    编辑:要将现有的tf.keras.Model 或tf.keras.Sequential 转换为新的模型子类printeverybatch:

    model_print=printeverybatch(existing_model.input,existing_model.output)
    #if existing_model is already compiled,
    model_print.compile(optimizer=existing_model.optimizer,loss=existing_model.loss)
    

    通过这样做,您将拥有两个版本的模型,即,model_print 将在拟合期间每批次打印 x、y 而existing_model 不会。这两个模型共享相同的底层、它们的连接和参数以及模型优化器的状态。

    【讨论】:

    • 谢谢!如何在现有的顺序模型上执行此操作? model = Sequential(); model.add(Dense(50, activation='sigmoid', input_shape=(784,))); ...
    • @Basj 您可以执行此操作来转换现有模型:model=printeverybatch(model.input,model.output)。如果您想在之后撤消它,请执行以下操作:model=tf.keras.Model(model.input,model.output)
    • 完成这些转换后,模型需要重新编译,优化器的实例需要相同,以保留优化器的状态(如果有的话)。
    • 感谢@LaplaceRicky 的回答。为了将来参考,也许您可​​以编辑答案以包含带有 Sequential 的示例代码,以显示您在最后 2 个 cmets 中解释的内容?
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2020-04-28
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2016-02-23
    • 1970-01-01
    相关资源
    最近更新 更多