TensorFlow Keras 模型中的自定义 train_step() 不按顺序打印值

问题描述 投票:0回答:1
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 的目的是什么?打印目的?

tensorflow keras deep-learning tensorflow2.0
1个回答
0
投票

您正在体验张量流中图模式和急切模式之间的区别。当您以与上面相同的方式运行代码时,您正在图形模式下运行它。并且有许多 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}
© www.soinside.com 2019 - 2024. All rights reserved.