我有一个模型构建,如下所示:
def og_build_model_5layer(n_rows,n_cols):
input = Input(shape=(n_cols,n_rows),NAME='INP')
print('model_input shape:' , input.shape)
c1 = Conv1D(50, 3,name = 'conv_1',padding='same',kernel_initializer="glorot_uniform")(INP)
b1 = BatchNormalization(name = 'BN_1')(c1)
a1 = Activation('relu')(b1)
c2 = Conv1D(50,3,name = 'conv_2',padding='same',kernel_initializer="glorot_uniform")(a1)
b2 = BatchNormalization(name = 'BN_2')(c2)
a2 = Activation('relu')(b2)
c3 = Conv1D(50, 3,name = 'conv_3',padding='same',kernel_initializer="glorot_uniform")(a2)
b3 = BatchNormalization(name = 'BN_3')(c3)
a3 = Activation('relu')(b3)
c4 = Conv1D(50, 3,name = 'conv_4',padding='same',kernel_initializer="glorot_uniform")(a3)
b4 = BatchNormalization(name = 'BN_4')(c4)
a4 = Activation('relu')(b4)
c5 = Conv1D(50, 3,name = 'conv_5',padding='same',kernel_initializer="glorot_uniform")(a4)
b5 = BatchNormalization(name = 'BN_5')(c5)
a5 = Activation('relu')(b5)
######## ADD one LSTM layer HERE ##################
fl = Flatten(name='fl')(LSTM_OUTPUT)
den = Dense(30,name='dense_1')(fl)
drp = Dropout(0.5)(den)
output = Dense(1, activation='sigmoid')(drp)
opt = Adam(learning_rate=1e-4)
model = Model(inputs=INP, outputs=output, name='model')
extractor = Model(inputs=ecg_input,outputs = model.get_layer('fl').output)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
print(model.summary)
return model,extractor
字符串
这里我有5个Conv1D层(每个层接受一个图像),我想添加一个LSTM层,它将把200个图像的序列放在一起,我想端到端地训练这个CNN+LSTM模型。我对如何添加LSTM层感到困惑,因为这需要一个序列(共处理200份投入)其中作为前5层将接受一次一个输入。任何帮助在这里表示赞赏。我知道的概念timeditized conv1D,但我不想使用它。可以这个端到端的培训能完成吗
1条答案
按热度按时间dkqlctbz1#
现在可能太晚了,但如果有人以后偶然发现这个,这就是我解决它的方法。
我有一个和你类似的问题要解决。老实说,我不完全理解你想要使用的架构。在我的情况下,我有两个独立的CNN,需要通过LSTM,输出连接在全连接层之前。
我犯的错误是在扁平化CNN的输出后使用LSTM。LSTM接受3维输入,而扁平化的CNN输出是2维的。我通过在扁平化之前传递LSTM数据来解决这个问题。下面是部分代码。
字符串
你的例子似乎很简单,你可以简单地在后面加上:
型
请注意,LSTM的输入是一个3DTensor。将CNN的输出展平后,您将得到一个2DTensor。这根本不行。否则,我上面的建议应该有效!