Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在嵌入层之后应用退出层是否与通过LSTM Dropout参数应用退出具有相同的效果?_Python_Tensorflow_Machine Learning_Keras_Lstm - Fatal编程技术网

Python 在嵌入层之后应用退出层是否与通过LSTM Dropout参数应用退出具有相同的效果?

Python 在嵌入层之后应用退出层是否与通过LSTM Dropout参数应用退出具有相同的效果?,python,tensorflow,machine-learning,keras,lstm,Python,Tensorflow,Machine Learning,Keras,Lstm,我对在Keras中将辍学应用于我的顺序模型的不同方式有点困惑 我的模型如下: 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

我对在Keras中将辍学应用于我的顺序模型的不同方式有点困惑

我的模型如下:

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'])
假设我以以下方式在嵌入层之后添加了一个额外的退出层:

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'])

这会有什么不同吗?因为我在LSTM参数中指定了dropout应该是0.5,或者我完全弄错了吗?

当你添加一个dropout层时,你只是将dropout添加到上一层的输出中,在你的情况下,你是将dropout添加到嵌入层中

LSTM单元比单层神经网络更复杂,当您在LSTM单元中指定漏失时,实际上是将漏失应用于LSTM单元中的4个不同子神经网络操作

下面是Colah在LSTM上的博客中对LSMT单元的可视化(LSTM/RNN的最佳可视化,)。黄色框表示4个完全连接的网络操作(每个操作都有自己的权重),它们发生在LSTM的引擎盖下-这被整齐地包装在LSTM单元包装器中,尽管手工编码并不困难

当您在LSTM单元格中指定
dropout=0.5
时,您在引擎盖下所做的就是将dropout应用于这4个神经网络操作中的每一个。这有效地增加了
model.add(Dropout(0.25))
4次,在图中所示的4个黄色块之后,在LSTM单元的内部添加一次

我希望通过简短的讨论,可以更清楚地了解LSTM包装器中应用的辍学(有效地应用于LSTM中的4个子网络)与嵌入层之后在序列中应用的辍学是如何不同的。直接回答你的问题,是的,这两个辍学定义非常不同


注意,作为有助于阐明这一点的进一步示例:如果要定义一个简单的5层完全连接的神经网络,则需要在每一层之后定义dropout,而不是一次
model.add(Dropout(0.25))
不是某种全局设置,而是将Dropout操作添加到操作管道中。如果您有5个层,则需要添加5个退出操作。

感谢您提供了详细解释和信息丰富的答案。它充分解释了我的问题,并以尽可能简单的形式加以澄清。为了使问题进一步复杂化,@Danny还指定了
recurrent\u dropout=0.5
50%的X\u t和X\u t+1之间的激活被丢弃。因此,有三种不同的方法可以删除LSTM层的激活。通过指定
dropout
recurrent\u dropout
将其放置在层内,或添加
dropout
层将其放置在LSTM层之后。