如何打印 Tensorflow 训练期间使用的每一对 x、y model.fit(X, Y)?

How to print every x, y pair used during a Tensorflow training model.fit(X, Y)?

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

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

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

问题:如何要求 Tensorflow 记录训练期间使用的每一对 input/target?(在 numpy ndarray 或 tensorflow 数据集的情况下)


注意:我曾考虑过像 中那样进行自定义 tf.keras.callbacks.Callback,但不幸的是,on_train_batch_begin 方法本身并未公开实际的批处理数据/训练数据。

您可以为此覆盖 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.ndarraytensorflow.data.Dataset

编辑: 要将现有的 tf.keras.Modeltf.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 将在拟合期间每批打印 xy,而 existing_model 不会。这两个模型共享相同的底层、它们的连接和参数以及模型优化器的状态。