将 RNN 和 CNN 与千层面相结合
Posted
技术标签:
【中文标题】将 RNN 和 CNN 与千层面相结合【英文标题】:combining RNN and CNN with lasagne 【发布时间】:2017-08-29 07:11:31 【问题描述】:我正在尝试在 10s 段的 EEG 数据上运行 1D CNN,然后使用 RNN 覆盖这些段之间的时间连接。
问题是,RNN 期望输入 batch_size x sequence_length x num_inputs
而 CNN 输出 batch_size x num_filters x sequence_length
这可以通过一个 dim-shuffle 层来解决
network = L.InputLayer(shape=(None, data_size[1], data_size[2]), input_var=input_var)
network = L.Conv1DLayer( network, num_filters=32, filter_size = 5)
network = L.DimshuffleLayer(network, (0, 2, 1))
network = L.LSTMLayer(network, 200)
但据我了解,RNN 现在将仅涵盖 在 sequence_length 内的时间连接,而不是 在 不同批次之间的时间连接,对吗?
如何获得片段之间的时间连接?
【问题讨论】:
【参考方案1】:回答我自己的问题:
RNN 确实只会在一批中学习依赖关系。
但是,Keras 有一种允许状态在批次之间转换的模式:stateful=True
network = keras.layers.LSTM(network, stateful=True)
现在以正确的顺序喂料很重要: 每个批次的第 i 个元素将使用第 i 个批次在时间 t-1 的状态进行学习。这意味着您在喂食批次时需要非常小心。
注意,这只会转换单元状态,不会在批次之间反向传播。作为副作用,您在预测时的初始状态必须设置并偏向您的结果。
【讨论】:
以上是关于将 RNN 和 CNN 与千层面相结合的主要内容,如果未能解决你的问题,请参考以下文章
Keras 功能 API:将 CNN 模型与 RNN 结合起来查看图像序列