Tensorflow 如何处理BN并在子类模型中进行行为改变?

Tensorflow 如何处理BN并在子类模型中进行行为改变?,tensorflow,keras,deep-learning,Tensorflow,Keras,Deep Learning,所以,批处理规范化和退出是根据您是处于培训阶段还是推断阶段而改变行为的层。通常,Keras会代表我处理这件事。但是,如果我在做定制培训,我该如何处理 我所做的:添加了if语句以在推理模式下绕过退出层 class mymodel(tf.keras.models.Model): def __init__(self, **kwargs): super(mymodel, self).__init__(**kwargs) self.l1 = tf.keras.lay

所以,批处理规范化和退出是根据您是处于培训阶段还是推断阶段而改变行为的层。通常,Keras会代表我处理这件事。但是,如果我在做定制培训,我该如何处理

我所做的:添加了if语句以在推理模式下绕过退出层

class mymodel(tf.keras.models.Model):
    def __init__(self, **kwargs):
        super(mymodel, self).__init__(**kwargs)
        self.l1 = tf.keras.layers.Dense(3, input_shape=(2,))
        self.l2 = tf.keras.layers.Dropout(0.9)
    def call(self, x, training=None):
        x = self.l1(x)
        if training:
            x = self.l2(x)
        return x
我不确定是否就这些?那么批量标准化呢

编辑:以上玩具示例的“自定义训练循环”是:

def train_one_ste(model, batch)
    with tf.GradientTape() as tape:
        output = model(batch)
    grad = tape.gradient(output, model.trainable_weights)
    optimizer.apply_gradients(zip(grad, model.trainable_weight)

为此,您可以手动控制学习阶段,在培训期间使用
K.set\u learning\u phase(1)
,在测试/推理期间使用
K.set\u learning\u phase(0)
。这里
K
是模块
keras.backend


还请注意,要使用给定批次运行一个培训步骤,您可以使用
模型。在批(x,y)
上进行培训,在这种情况下,Keras将为您管理学习阶段。

退出
层检查是否在培训模式下运行。所以你不需要这张支票。@PedroMarques它怎么知道的?请记住,我不会使用.fit方法进行训练,我有一个自定义训练循环。您将自定义训练循环称为什么?请包含准确的代码。@MatiasValdenegro类似于常规的批上循环,我将批传递给模型,获取输出,计算损失,计算粒度,backprop,更新参数,循环结束。不,我们需要代码是有原因的,所有这些细节都很重要。你认为不重要的东西实际上可能很重要。这比我想象的要容易。谢谢你给我额外的小费。