class model_sub(tf.keras.Model):
def __init__(self,modell):
super().__init__()
self.model=modell
self.i=1
def compile(self,opt,lloss,**kwargs):
super().compile(**kwargs)
self.lloss=lloss
self.opt=opt
def train_step(self,data):
print(self.i)
self.i+=1
loss=0.007
return {"loss":loss}
my_model.fit(train_dataset,epochs=1)
如果对每批数据都通过 fit() 调用 train_step ,为什么不打印从 1 到 4 的值(我的批次数是 4 )。另外,return 语句中 value 的目的是什么?打印目的?
您正在体验张量流中图模式和急切模式之间的区别。当您以与上面相同的方式运行代码时,您正在图形模式下运行它。并且有许多 pythonic 操作变得无效,需要张量流操作以图模式复制它们。但是如果你在 eager 模式下运行你的代码,那么你可能能够运行 pythonic 操作(AFAIK,除非有一些未知的惊喜!)。
要在 eager 模式下运行代码并能够看到
self.i
的值不断增加,您只需通过
my_model.compile(
opt=tf.keras.optimizers.Adam(),
lloss=tf.keras.losses.MeanSquaredError(),
run_eagerly=True
)
但是,如果您在图形模式下运行代码,则可以执行以下操作,并且不需要在编译期间设置
run_eagerly
。在这里,您初始化目标变量并通过对其调用 tf.assign_add
操作来递增它。
class model_sub(tf.keras.Model):
def __init__(self, modell):
super().__init__()
self.model = modell
self.i = tf.Variable(
1, dtype=tf.int32, trainable=False
)
def train_step(self, data):
tf.print(self.i)
self.i.assign_add(1)
loss = 0.007
return {"loss": loss}