将 RNN 和 CNN 与烤宽面条相结合
combining RNN and CNN with lasagne
我正在尝试 运行 在 10 秒的 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 现在将仅涵盖 within sequence_length 的时间连接,而不是 between批次,对吗?
如何获得片段之间的时间联系?
回答我自己的问题:
RNN 确实只会学习一批中的依赖关系。
但是,Keras 有一种模式允许状态在批次之间转换:stateful=True
network = keras.layers.LSTM(network, stateful=True)
现在以正确的顺序喂养批次很重要:
每个批次的第 i 个元素将与第 i 个批次在时间 t-1 的状态一起学习。这意味着您在喂养批次时需要非常小心。
请注意,这只会转换细胞状态,不会在批次之间反向传播。作为副作用,您在预测时的初始状态将必须设置并使您的结果产生偏差。
我正在尝试 运行 在 10 秒的 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 现在将仅涵盖 within sequence_length 的时间连接,而不是 between批次,对吗?
如何获得片段之间的时间联系?
回答我自己的问题:
RNN 确实只会学习一批中的依赖关系。
但是,Keras 有一种模式允许状态在批次之间转换:stateful=True
network = keras.layers.LSTM(network, stateful=True)
现在以正确的顺序喂养批次很重要: 每个批次的第 i 个元素将与第 i 个批次在时间 t-1 的状态一起学习。这意味着您在喂养批次时需要非常小心。
请注意,这只会转换细胞状态,不会在批次之间反向传播。作为副作用,您在预测时的初始状态将必须设置并使您的结果产生偏差。