我试图基于Yarin Gal和Zoubin Ghahramani的论文https://arxiv.org/pdf/1512.05287.pdf中定义的变体RNN架构,使用Keras和Python中的Tensorflow后端实现LSTM神经网络。
这个想法基本上是在每个时间步上都应用相同的丢失掩码,在输入/输出连接和循环连接上,如下图所示:
通过阅读Keras文档,我发现我们可以使用参数dropout
和recurrent_dropout
在LSTM单元上应用dropout。我的第一个问题是:
然后,我还看到我们可以在LSTM单元之后创建一个Dropout层,并使用noise_shape
参数,可以强制该层每次都应用相同的dropout掩码。我是通过设置noise_shape=(K.shape(x)[0], 1, K.shape(x)[2])
来完成的。我的第二个问题是:
总而言之,我有一种感觉,使用第一种方法,我们可以在循环连接上应用dropout,但不能在每个时间步上应用相同的dropout掩码,而使用第二种方法,则相反。我错了吗?