Keras 中的 _uses_learning_phase 是什么?

swm*_*mfg 5 keras tensorflow

我正在尝试在 Keras 中编写自己的循环层,并在Keras源代码中注意到这一行:

    # Properly set learning phase on output tensor.
    if 0 < self.dropout + self.recurrent_dropout:
        if training is None:
            output._uses_learning_phase = True
Run Code Online (Sandbox Code Playgroud)

检查后端代码in_train_phase

if training is None:
    training = learning_phase()
    uses_learning_phase = True
else:
    uses_learning_phase = False
Run Code Online (Sandbox Code Playgroud)

这比较混乱。“训练”不就是“学习阶段”吗?!我想更重要的是,我需要设置_uses_learning_phaseoutput在我的自定义复发层?

小智 3

简介 “训练标志”旨在使模型(或层)在预测结果或正在测试时表现出与训练不同的行为。根据所使用的后端,Keras 可能需要实现自己的布尔“训练标志”(对于 Keras 2.2.4,在CNTK上)或者可以使用本机后端张量(如Tensorflow),因此集成了动态用途代码。

因此 Layer 类具有如下属性:

uses_learning_phase: Whether any operation
    of the layer uses `K.in_training_phase()`
    or `K.in_test_phase()`.
Run Code Online (Sandbox Code Playgroud)

并且输出张量可以被赋予由属性读取的属性 _uses_learning_phase 。如果任何输出张量具有该属性(并且为 true),则该层的属性返回 true。

Keras 循环层中的用法 您的代码片段来自 keras/layers/recurrent.py ,当调用 private _generate_dropout_mask 方法时,将调用后端的操作创建者“in_train_phase()” 。因此,输出张量的标志“_uses_learning_phase”被设置。

引用后端代码的说明

in_training_phase()和in_test_phase() 是相同 。“training”是一个可选参数,引用训练标志。如果未给出参数,则自动引用训练标志

training = learning_phase()
Run Code Online (Sandbox Code Playgroud)

然而,如果训练标志是后端的张量并且未设置可选训练参数,则仅设置输出张量的属性 _uses_learning_phase (并设置为 True)。(这也可以解释为什么一层需要设置 _uses_learning_phase 本身,但我没有看到通过 in_test_phase 创建操作而不标记输出张量的用例。目前,假设有一个。)