我正在使用CNN + LSTM解决某些二进制分类问题。我的代码如下。
def create_network():
model = Sequential()
model.add(Conv1D(200, kernel_size=2, activation = 'relu', input_shape=(35,6)))
model.add(Conv1D(200, kernel_size=2, activation = 'relu'))
model.add(MaxPooling1D(3))
model.add(LSTM(200, return_sequences=True))
model.add(LSTM(200, return_sequences=True))
model.add(LSTM(200))
model.add(Dense(100))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
使用上述模型时,我得到了一些不好的结果。但是,当我删除model.add(MaxPooling1D(3))
层时,结果有所改善。
我的问题如下。
如果需要,我很乐意提供更多详细信息。
答案 0 :(得分:1)
首先,您不必使用MaxPooling1D层。 MaxPooling只会减少传递到LSTM的输入量(在这种情况下)。 从纯粹的技术角度来看,LSTM可以使用任何序列长度,并且keras会自动设置正确数量的输入特征
虽然这里有一些有趣的事情,您可能想看看:
很难说某种共享机制会比另一种更好。但是,直觉是,最大池在从极端情况推断时效果更好,而平均池在忽略极端情况下效果更好。
您将步幅保留为隐式,应注意的是,池化和卷积层的默认步幅值是不同的(None vs 1)。这意味着比较有无最大池的网络并不能准确地将苹果与苹果进行比较,因为您大大减少了LSTM层将获得的数据量。