我正在尝试将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图层需要完全定义的形状。这个问题有解决方案吗?
答案 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批次,每个批次具有不同的长度,没有遮罩或填充。