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