Red neuronal convolucional BLSTM recurrente - longitudes de secuencia arbitrarias

Usando Keras + Theano, hice con éxito una red neuronal bidireccional-LSTM recurrente que es capaz de entrenar y clasificar secuencias de ADN de longitudes arbitrarias, utilizando el siguiente modelo (para ver el código de trabajo completo, ver: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 el rendimiento del modelo, quiero agregar capas adicionales. Lo más preferiblemente capas de convolución y agrupación máxima. Hice varios intentos, pero fallé cada vez. Por ejemplo, cambiar la línea 2 a las siguientes 3 líneas:

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

El modelo compila, pero arroja un error:

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 hay un problema con las dimensiones. Sin embargo, he experimentado con remodelar capas, sin éxito.

¿Es posible usar capas convolucionales y / o de agrupación máxima en el contexto de longitudes de secuencia arbitrarias?

¡Cualquier ayuda en este asunto sería muy apreciada!

Respuestas a la pregunta(0)

Su respuesta a la pregunta