我正在尝试在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
?
答案 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创建操作而不标记输出张量的用例。现在,假设存在一个。)