如何打印 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
.
记录训练操作期间输入神经网络的每一对 x
、y
会有所帮助:
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.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
不会。这两个模型共享相同的底层、它们的连接和参数以及模型优化器的状态。
我正在尝试调试为什么两个训练操作的行为不同,而我以稍微不同的格式为它们提供相同的数据:一次是 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 记录训练期间使用的每一对 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.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
不会。这两个模型共享相同的底层、它们的连接和参数以及模型优化器的状态。