Keras中的_uses_learning_phase是什么?

时间:2018-09-12 12:59:29

标签: tensorflow keras

我正在尝试在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

检查in_train_phase的{​​{3}}代码:

if training is None:
    training = learning_phase()
    uses_learning_phase = True
else:
    uses_learning_phase = False

这很令人困惑。 “训练”不是“学习阶段”吗?我想更重要的是,我是否需要在自定义循环图层的_uses_learning_phase上设置output

1 个答案:

答案 0 :(得分:2)

简介 “训练标志”是指to enable a Model(或图层)在预测结果或正在测试时表现得与训练不同。 根据所使用的后端,Keras可能需要实现自己的布尔“训练标志”(对于Keras 2.2.4,在CNTK上),或者可以使用本机后端张量(例如与Tensorflow一样)动态用途的代码已集成。

因此,图层类has a property的描述如下:

uses_learning_phase: Whether any operation
    of the layer uses `K.in_training_phase()`
    or `K.in_test_phase()`.

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

Keras循环层中的用法 您的代码段来自keras / layers / recurrent.py,并且在调用私有_generate_dropout_mask方法时,后端的操作创建者“ in_train_phase()”为being called。因此,正在设置输出张量的标志“ _uses_learning_phase”。

引用的后端代码的说明

in_training_phase()和in_test_phase()为just the same。 “ training”是一个可选参数,它引用了Training Flag。如果未提供参数,则会在以下位置自动引用训练标志

training = learning_phase()

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