Rede neural convolucional BLSTM recorrente - comprimentos de sequência arbitrários

Usando Keras + Theano, criei com sucesso uma rede neural bidirecional-LSTM recorrente, capaz de treinar e classificar sequências de DNA de comprimentos arbitrários, usando o seguinte modelo (para obter o código completo, consulte:http://pastebin.com/jBLv8B72):

sequence = Input(shape=(None, ONE_HOT_DIMENSION), dtype='float32')
dropout = Dropout(0.2)(sequence)

# bidirectional LSTM
forward_lstm = LSTM(
    output_dim=50, init='uniform', inner_init='uniform', forget_bias_init='one', return_sequences=True,
    activation='tanh', inner_activation='sigmoid',
)(dropout)
backward_lstm = LSTM(
    output_dim=50, init='uniform', inner_init='uniform', forget_bias_init='one', return_sequences=True,
    activation='tanh', inner_activation='sigmoid', go_backwards=True,
)(dropout)
blstm = merge([forward_lstm, backward_lstm], mode='concat', concat_axis=-1)

dense = TimeDistributed(Dense(NUM_CLASSES))(blstm)

self.model = Model(input=sequence, output=dense)
self.model.compile(
    loss='binary_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)

Para aumentar o desempenho do modelo, quero adicionar camadas adicionais. Mais preferencialmente as camadas de convolução e max-pooling. Fiz várias tentativas, mas falhei cada vez. Por exemplo, alterando a linha 2 para as três seguintes linhas:

convolution = Convolution1D(filter_length=6, nb_filter=10)(sequence)
max_pooling = MaxPooling1D(pool_length=2)(convolution)
dropout = Dropout(0.2)(max_pooling)

O modelo compila, mas gera um erro:

ValueError: Input dimension mis-match. (input[0].shape[1] = 111, input[1].shape[1] = 53)
Apply node that caused the error: Elemwise{Composite{((i0 * log(i1)) + (i2 * log(i3)))}}(timedistributed_1_target, Elemwise{clip,no_inplace}.0, Elemwise{sub,no_inplace}.0, Elemwise{sub,no_inplace}.0)
Toposort index: 546
Inputs types: [TensorType(float32, 3D), TensorType(float32, 3D), TensorType(float32, 3D), TensorType(float32, 3D)]
Inputs shapes: [(1L, 111L, 2L), (1L, 53L, 2L), (1L, 111L, 2L), (1L, 53L, 2L)]
Inputs strides: [(888L, 8L, 4L), (424L, 8L, 4L), (888L, 8L, 4L), (424L, 8L, 4L)]
Inputs values: ['not shown', 'not shown', 'not shown', 'not shown']
Outputs clients: [[Sum{axis=[1, 2], acc_dtype=float64}(Elemwise{Composite{((i0 * log(i1)) + (i2 * log(i3)))}}.0)]]

Obviamente, há um problema com as dimensões. Eu experimentei remodelar camadas, sem sucesso.

É possível usar camadas convolucionais e / ou de pool máximo no contexto de comprimentos de sequência arbitrários?

Qualquer ajuda sobre este assunto seria muito apreciada!

questionAnswers(0)

yourAnswerToTheQuestion