_generate_dropout_mask 在 LSTM 模型中调用的位置

where is _generate_dropout_mask called in LSTM model

问题的背景

我正在创建自己的循环层并希望允许丢失,因此我希望能够以类似于 LSTM 的方式定义丢失掩码。

我注意到他们在方法中定义了掩码。

问题

keras.layers.recurrent.LSTMCell 方法 _generate_dropout_mask is called in order to create the member variable dropout_mask 何时何地?

我在 github 存储库中搜索了 _generate_dropout_mask,试图查看它是否调用了某个地方,但在 keras.layers.recurrent 模块以外的任何地方都找不到它的提及。

是否有一部分训练可能会查找所有带有单个下划线的可调用层属性,并在 keras.layer.build() 之前运行它们?由于 dropout 仅用于训练,并且由于掩码必须在构建之前可用,我怀疑这一点,因为这可能允许层使用 undrescore 表示法定义预构建方法。

该方法是class、SimpleRNNCell(Layer)L659的成员。

该单元格是 SimpleRNN(RNN) class 的成员,在 init 方法中定义,并传递给超级 class RNN。按照线路:L919、L933、L339、L357。

该方法在L942层的call方法内部调用。

当您 call 一个层构建您的功能 API 模型时,调用方法按字面意思调用。不确定 Sequential() 模型何时调用构建。但这肯定是在编译之前,或者至少是在编译之前。这是一个只发生一次的阶段,它将所有张量从输入连接到输出,创建实际的内部图。


您可以使用dir(instance)找到所有方法。
您可以使用 getattr(instance,methodName)(...) 来调用该方法。

但是build()是在训练之前调用的。当您使用功能性 API 模型创建图形时首次调用该层时会调用它。