我正在尝试在 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_phase
在output
在我的自定义复发层?
小智 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 创建操作而不标记输出张量的用例。目前,假设有一个。)
归档时间: |
|
查看次数: |
1795 次 |
最近记录: |