首页 > 解决方案 > Keras 和带有 dropout 的 LSTM 的 tensorflow 实现之间的区别

问题描述

我正在查看 tensorflow 和 Keras 中的 LSTM 单元的文档。特别是,我也想申请辍学。这是我在 Keras 中的内容,并希望在 tensorflow 中应用相同的 LSTM 单元:

cell = LSTM(num_units_2, return_sequences=True, dropout=dropout, recurrent_dropout=dropout)(net)

因此,我知道我需要tf.nn.rnn_cell.LSTMCell在 tensorflow 中使用num_units = num_units_2. 其次,我需要一个DropoutWrapperas:

cell = tf.nn.rnn_cell.DropoutWrapper(cell)

现在,我想申请dropoutrecurrent_dropout类似的 Keras 代码。因此,我发现 tensorflow 的 dropout 实现将在每个时间步应用不同的 dropout 掩码,除非variational_recurrent设置为 True (但我不确定variational_recurrent 的详细工作原理)。

此外,我不确定 Keras 中的 LSTM 是否在每个时间步也应用不同的 Mask。

其次,我对两者都提到的 theoutput_keep_prob和 the之间的区别感到困惑:state_keep_prob

output_keep_prob:单位Tensor或0到1之间的浮点数,输出保持概率;如果它是常数且为 1,则不会添加输​​出 dropout...

任何帮助深表感谢!!

标签: tensorflowkeraslstm

解决方案


变分dropout有什么作用

据我所知,变分辍学的主要新颖之处在于对所有展开的步骤(如您所说)使用相同的辍学掩码。

output_keep_prob和之间的区别state_keep_prob

output_keep_prob是应用于 LSTM 单元的输出 (h) 的state_keep_prob辍学率,其中是应用于 LSTM 状态的单元 (c) 的辍学率。

Keras 中的辍学选择

查看LSTM 源代码_generate_dropout_mask中的方法及其对 Keras 的 LSTMCell 的使用,我认为 Keras LSTM 仅对循环连接(即)使用变分循环丢失。但我对此不是100%有信心。self._recurrent_dropout_mask


推荐阅读