我正在尝试构建一个卷积双向LSTM来对本文的DNA序列进行分类:DanQ: a hybrid convolutional and recurrent deep neural network for quantifying the function of DNA sequences (Architecture picture on the second page)

它的简短版本是构建一个热编码DNA序列:

`'ATACG...' = [
[1,0,0,0],
[0,0,0,1],
[1,0,0,0],
[0,1,0,0],
[0,0,1,0],
...],`

然后将其馈送到卷积 - relu-maxpooling层以查找图案,然后将其馈送到双向LSTM网络以学习长距离依赖性 .

原始源代码是here.

但是,它使用过时版本的Keras并包含对Seya的依赖,这是我想要避免的 . 这是我第一次尝试构建模型:

inputs = Input(shape=(500,4))
convo_1 = Convolution1D(320, border_mode='valid',filter_length=26, activation="relu", subsample_length=1)(inputs)
maxpool_1 = MaxPooling1D(pool_length=13, stride=13)(convo_1)
drop_1 = Dropout(0.2)(maxpool_1)
l_lstm = LSTM(320, return_sequences = True, go_backwards= False)(drop_1)
r_lstm = LSTM(320, return_sequences = True, go_backwards= True)(drop_1)
merged = merge([l_lstm, r_lstm], mode='sum')
drop_2 = Dropout(0.5)(merged)
flat = Flatten()(drop_2)
dense_1 = Dense(320, activation='relu')(flat)
out = Dense(num_classes, activation='sigmoid')(dense_1)

model = Model(inputs, out)
print ('compiling model')
model.compile(loss='binary_crossentropy', optimizer='rmsprop')
checkpointer = ModelCheckpoint(filepath=sc_local_dir+"DanQ_bestmodel.hdf5", verbose=1, save_best_only=True)
earlystopper = EarlyStopping(monitor='val_loss', patience=5, verbose=1)

不幸的是,在训练期间损失几乎保持不变,并且准确性也保持不变 . 这让我相信我已经错误地设置了模型,或者 1-dimensional convolution 在这种输入上没用 . 所以我试图切换到 2D convolution

inputs = Input(shape=(1, 500,4))
convo_1 = Convolution2D(320, nb_row=15, nb_col=4, init='glorot_uniform', \
                       activation='relu', border_mode='same')(inputs)
maxpool_1 = MaxPooling2D((15, 4))(convo_1)
flat_1 = Flatten()(maxpool_1)
drop_1 = Dropout(0.2)(flat_1)
l_lstm = LSTM(320, return_sequences = True, go_backwards= False)(drop_1)
r_lstm = LSTM(320, return_sequences = True, go_backwards= True)(drop_1)
merged = merge([l_lstm, r_lstm], mode='sum')
drop_2 = Dropout(0.5)(merged)
flat = Flatten()(drop_2)
dense_1 = Dense(320, activation='relu')(flat)
out = Dense(num_classes, activation='sigmoid')(dense_1)

model = Model(inputs, out)
print ('compiling model')
model.compile(loss='binary_crossentropy', optimizer='rmsprop')
checkpointer = ModelCheckpoint(filepath=sc_local_dir+"DanQ_bestmodel.hdf5", verbose=1, save_best_only=True)
earlystopper = EarlyStopping(monitor='val_loss', patience=5, verbose=1)

在尝试将展平图层送入LSTM时,会出现以下错误:

例外:输入0与层lstm_4不兼容:预期ndim = 3,发现ndim = 2

我是否正确设置了1D卷积LSTM?如果是这样,那么我可能需要升级到2D Convolution LSTM,在这种情况下,我该如何修复输入错误?