如何在Keras中定义ConvLSTMcoder_decoder?

时间:2019-02-18 17:08:47

标签: keras conv-neural-network recurrent-neural-network encoder-decoder

我已经看到了在Keras中使用LSTM构建编码器-解码器网络的示例,但是我希望拥有ConvLSTM编码器-解码器,并且由于ConvLSTM2D不接受任何“ initial_state”参数,因此我可以传递编码器的初始状态到解码器,我尝试在Keras中使用RNN,并尝试将ConvLSTM2D作为RNN的单元传递,但是出现以下错误:

ValueError: ('`cell` should have a `call` method. The RNN was passed:', <tf.Tensor 'encoder_1/TensorArrayReadV3:0' shape=(?, 62, 62, 32) dtype=float32>)

这是我尝试定义RNN单元的方法:

first_input = Input(shape=(None, 62, 62, 12))
encoder_convlstm2d = ConvLSTM2D(filters=32, kernel_size=(3, 3),
                                    padding='same',
                                    name='encoder'+ str(1))(first_input )
encoder_outputs, state_h, state_c = keras.layers.RNN(cell=encoder_convlstm2d, return_sequences=False, return_state=True, go_backwards=False,
                 stateful=False, unroll=False)

1 个答案:

答案 0 :(得分:0)

以下是我的方法,也许它不是一个完全承诺的基于编码器-解码器的解决方案,但它在我使用 ConvLSTM 的情况下效果很好。

def ConvLSTM(input_shape):

print(np.shape(input_shape))

inpTensor = Input((input_shape))

#encoder
net1 = ConvLSTM2D(filters=50, kernel_size=3,
                   padding='same', return_sequences=True)(inpTensor)

max_pool1 = MaxPooling3D(pool_size=(2, 2, 2), strides=1, padding='same')(net1)

bn1 = BatchNormalization(axis=1)(max_pool1)

dp1 = Dropout(0.2)(bn1)


net2 = ConvLSTM2D(filters=100, kernel_size=3,
                    padding='same', return_sequences=True)(dp1)

max_pool2 = MaxPooling3D(pool_size=(2, 2, 2), strides=1, padding='same')(net2)

bn2 = BatchNormalization(axis=1)(max_pool2)

dp2 = Dropout(0.2)(bn2)

net3 = ConvLSTM2D(filters=200, kernel_size=3,
                   padding='same', return_sequences=True)(dp2)

max_pool3 = MaxPooling3D(pool_size=(2, 2, 2), strides=1, padding='same')(net3)

bn3 = BatchNormalization(axis=1)(max_pool3)

dp3 = Dropout(0.2)(bn3)


#decoder
net4 = ConvLSTM2D(filters=200, kernel_size=3,
                    padding='same', return_sequences=True)(dp3)

up1 = UpSampling3D((1, 1, 1))(net4)

net5 = ConvLSTM2D(filters=100, kernel_size=3,
                    padding='same', return_sequences=False)(up1)

up2 = UpSampling2D((1, 1))(net5)


out = Conv2D(filters=1, kernel_size=(3, 3), activation='sigmoid',
                  padding='same', data_format='channels_last')(up2)

return Model(inpTensor, out)