D.B*_*ick 4 python machine-learning lstm keras tensorflow
我对在Keras中将Dropout应用到我的Sequential模型的不同方法感到有些困惑.
我的模型如下:
model = Sequential()
model.add(Embedding(input_dim=64,output_dim=64, input_length=498))
model.add(LSTM(units=100,dropout=0.5, recurrent_dropout=0.5))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
假设我以下面的方式在嵌入层之后添加了一个额外的Dropout图层:
model = Sequential()
model.add(Embedding(input_dim=64,output_dim=64, input_length=498))
model.add(Dropout(0.25))
model.add(LSTM(units=100,dropout=0.5, recurrent_dropout=0.5))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
这会有什么不同,因为我随后指定LSTM参数中的丢失应该是0.5,或者我是否认为这一切都错了?
Dav*_*rks 14
添加dropout图层时,只会将dropout添加到上一层的输出中,在这种情况下,您要将dropout添加到嵌入图层中.
LSTM单元比单层神经网络更复杂,当您在LSTM单元中指定丢失时,实际上将丢失应用于LSTM单元中的4个不同的子神经网络操作.
下面是Colah博客关于LSTMs的LSMT细胞的可视化(LSTM/RNNs的最佳可视化,http: //colah.github.io/posts/2015-08-Understanding-LSTMs/ ).黄色框表示4个完全连接的网络操作(每个都有自己的权重),这些操作发生在LSTM的引擎盖下 - 这整齐地包裹在LSTM单元包装器中,尽管手动编码并不是很难.
当您dropout=0.5在LSTM单元格中指定时,您正在进行的操作是将丢失应用于这4个神经网络操作中的每一个.这有效地model.add(Dropout(0.25))在LSTM单元的内部中,在图中看到的4个黄色块中的每一个之后有效地添加4次.
我希望通过简短的讨论可以更清楚地了解LSTM包装器中应用的压降是如何应用于LSTM中有效的4个子网络的,与在嵌入层之后的序列中应用一次的压差不同.
并且直接回答你的问题,是的,这两个辍学定义是非常不同的.
请注意,作为帮助阐明这一点的另一个例子:如果要定义一个简单的5层完全连接的神经网络,则需要在每个层之后定义丢失,而不是一次.model.add(Dropout(0.25))它不是某种全局设置,它将丢失操作添加到操作管道中.如果您有5个图层,则需要添加5个退出操作.