将卷积层和LSTM层与可变长度序列组合

时间:2017-06-12 15:28:16

标签: machine-learning keras convolution lstm

我正在尝试将Conv2D图层与图像上的LSTM图层组合在一起。 问题是Conv2D层将4D张量作为输入,包括通道数,而我的LSTM网络需要3D张量。

问题是我使用了bucketing,因此我的输入没有预定义的时间步数。我想做那样的事情:

input_data = Input(shape=[None, nb_features, 1])
cnn1 = Conv2D(nb_filters, kernel_size)(input_data)
cnn2 = Conv2D(nb_filters, kernel_size)(cnn1)
reshape = Reshape(target_shape=[None, nb_features])(cnn2)
gru1 = Bidirectional(GRU(rnn_size, return_sequences=True))(reshape)
gru2 = Bidirectional(GRU(rnn_size, return_sequences=True))(gru1)
out = TimeDistributed(Dense(nblabels))(gru2)
output = Activation('softmax')(out)

但Reshape图层需要完全定义的形状。这个问题有解决方案吗?

1 个答案:

答案 0 :(得分:-1)

我的建议是你使用:

input_data = Input((None, nb_features))
cnn1 = Conv1D(nb_filters, kernel_size)(input_data)
cnn2 = Conv1D(nb_filters, kernel_size)(cnn1)

gru1 = Bidirectional(GRU(rnn_size, return_sequences=True))(cnn2)
gru2 = Bidirectional(GRU(rnn_size, return_sequences=True))(gru1)
out = TimeDistributed(Dense(nblabels))(gru2)
output = Activation('softmax')(out)

然后你可以在开头使用Masking Layer(并用虚拟值填充你的输入数据),或者你可以使用许多numpy批次,每个批次具有不同的长度,没有遮罩或填充。