我正在审查tensorflow和Keras中LSTM单元的文档。特别是,我也想申请辍学。这是我在Keras中拥有的,想在张量流中应用相同的LSTM单元:
cell = LSTM(num_units_2, return_sequences=True, dropout=dropout, recurrent_dropout=dropout)(net)
因此,我知道我需要在tf.nn.rnn_cell.LSTMCell
的张量流中使用num_units = num_units_2
。其次,我需要一个DropoutWrapper
:
cell = tf.nn.rnn_cell.DropoutWrapper(cell)
现在,我想应用与Keras代码类似的dropout
和recurrent_dropout
。因此,我发现tensorflow的dropout实现将在每个时间步上应用不同的dropout掩码,除非将variational_recurrent
设置为True(但我不确定variantal_recurrent的工作原理)。
此外,我不确定Keras中的LSTM是否在每个时间步上都应用了不同的Mask。
第二,我对output_keep_prob
和state_keep_prob
之间的区别感到困惑,都提到:
output_keep_prob :单位张量或浮点数介于0和1之间,输出保持概率;如果它是常数且为1,则不会添加任何输出压降...
非常感谢您的帮助!
答案 0 :(得分:1)
据我所知,变异辍学的主要新颖之处在于,所有展开的步骤都使用了相同的辍学掩码(如您所说)。
output_keep_prob
与state_keep_prob
之间的差异 output_keep_prob
是应用于LSTM单元的输出(h)的丢失率,其中state_keep_prob
是应用于LSTM状态的单元(c)的丢失率。
看看Keras的LSTM source code和its use for the LSTMCell中的_generate_dropout_mask
方法,我认为Keras LSTM仅将可变递归丢弃用于循环连接(即self._recurrent_dropout_mask
)。但是我对此不是100%自信。