Tensorflow 需要更好地理解Keras模型调用方法的训练参数

Tensorflow 需要更好地理解Keras模型调用方法的训练参数,tensorflow,keras,Tensorflow,Keras,我想在调用Keras模型时更好地理解参数训练 在所有教程(如)中,都解释了当您执行自定义训练步骤时,应该这样调用模型(因为某些层的行为可能会有所不同,具体取决于您是否要执行训练或推断): 当您想要进行推理时,您应该将training设置为false: pred = model(x, training=False) 我现在想知道的是,函数模型的创建会如何影响这一点。假设我有两个模型:model_base和model_head,我想从这两个模型中创建一个新模型,在这里我希望model_base总是

我想在调用Keras模型时更好地理解参数训练

在所有教程(如)中,都解释了当您执行自定义训练步骤时,应该这样调用模型(因为某些层的行为可能会有所不同,具体取决于您是否要执行训练或推断):

当您想要进行推理时,您应该将training设置为false:

pred = model(x, training=False)
我现在想知道的是,函数模型的创建会如何影响这一点。假设我有两个模型:model_base和model_head,我想从这两个模型中创建一个新模型,在这里我希望model_base总是用
training=False
调用(因为我计划像本教程中一样冻结它):

在这种情况下,当我稍后调用
new\u model(x\u new,training=True)
时会发生什么?对于
base\u模型
使用
training=False
是否会被否决?或者,对于
base\u模型
,无论我将什么传递到
新模型
,现在的培训都将设置为True?如果是后者,这是否也意味着,如果我设置例如
输出=头部模型(输入,训练=真)
,则新模型的这部分将始终在训练模式下运行?当我像这样运行新的(x)模型(x(u)新(x)新(x)新(x)新(x)新(x(u


提前谢谢

training
是一个布尔参数,用于确定此
调用
函数是在训练模式下运行还是在推理模式下运行。例如,
Dropout
层主要用于在模型训练中进行正则化,随机降低权重,但在推理时间或预测时间,我们不希望发生这种情况

y = Dropout(0.5)(x, training=True) 
这样,我们将
training=True
设置为
Dropout
层的培训时间。当我们调用
.fit()
时,它将标志设置为
True
;当我们使用
evaluate
predict
时,它将标志设置为
False
。自定义训练循环也是如此。当我们将输入张量传递给
GradientTape
范围内的模型时,我们可以设置此参数;虽然没有手动设置,但程序会自行解决。推理时间也是如此。因此,如果我们希望层分别操作
训练
模式或
推理
模式,则此
训练
参数设置为

# training mode 
with tf.GradientTape() as tape:
   logits = model(x, training=True) # forward pass

# inference mode 
al_logits = model(x, training=False) 
现在来回答你的问题。定义模型之后

# Freeze the base_model
base_model.trainable = False

inputs = keras.Input(shape=(150, 150, 3))
x = base_model(inputs, training=False)
outputs = head_model(x)

new_model = keras.Model(inputs, outputs)

现在,如果您运行此新模型,无论是
.fit()
还是自定义训练循环,
base\u模型
将始终在推理模式下运行,因为它设置了
training=False

谢谢!这意味着,每当我在创建函数模型的上下文中将param设置为某个特定的值(true或false),它都将固定为该值,不管我以后使用什么,对吗?是的,这是正确的。
# training mode 
with tf.GradientTape() as tape:
   logits = model(x, training=True) # forward pass

# inference mode 
al_logits = model(x, training=False) 
# Freeze the base_model
base_model.trainable = False

inputs = keras.Input(shape=(150, 150, 3))
x = base_model(inputs, training=False)
outputs = head_model(x)

new_model = keras.Model(inputs, outputs)