您可以为此目的覆盖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 不会。这两个模型共享相同的底层、它们的连接和参数以及模型优化器的状态。