Я пытаюсь объединить LSTM и CNN в модели с несколькими входами, но возникает ошибка формы - PullRequest
0 голосов
/ 27 мая 2020

Я реализую модель с несколькими входами во время чтения книги. Эта модель объединяет CNN и LSTM.

Вход CNN и вход LSTM различны. Так что, конечно, формы должны быть разными. Есть ли способ подогнать формы, не влияя на значения данных ??

Или форма ввода должна быть такой же для ввода?

Я не знаю, как это сделать объединить. Любая помощь будет принята с благодарностью.

МОДЕЛЬ CNN

with K.tf_ops.device('/device:GPU:0'):
    input_tensor = Input(shape=(64,64,1))
    x= layers.Conv2D(64, kernel_size=(3,3),activation='relu')(input_tensor)
    x= layers.Conv2D(128 ,kernel_size=(3,3),activation='relu')(x)
    x= layers.MaxPooling2D(2)(x)
    x= layers.Dropout(0.5)(x)
    x= layers.Conv2D(256 ,kernel_size=(3,3),activation='relu')(x)
    x= layers.MaxPooling2D(2)(x)
    x= layers.Dropout(0.5)(x)
    x= layers.Conv2D(512 ,kernel_size=(3,3),activation='relu')(x)
    x= layers.MaxPooling2D(2)(x)
    x= layers.Dropout(0.5)(x)
    x= layers.Flatten()(x)
    x= layers.Dropout(0.5)(x)
    x= layers.Dense(512,activation='relu')(x)
    x= layers.Dropout(0.5)(x)
    last_1= layers.Dense(20,activation='softmax')(x)


max_word = 33
max_len =107
nb_classes = 20

LSTM

with K.tf_ops.device('/device:GPU:0'):
    input_tensor_LSTM = Input(shape=(None,),dtype='int32',name='permission')
    x_2=layers.Embedding(max_word,64,input_length=max_len)(input_tensor_LSTM)
    x_2=layers.LSTM(60,return_sequences= True)(x_2)
    x_2=layers.GlobalMaxPool1D()(x_2)
    x_2= layers.Dropout(0.5)(x_2)
    x_2= layers.Dense(50,activation='relu')(x_2)
    x_2= layers.Dropout(0.5)(x_2)
    last_2= layers.Dense(20,activation='softmax')(x_2)


merged_model = concatenate([last_1, last_2])
last = layers.Dense(20,activation='softmax')(merged_model)

model = Model([input_tensor,input_tensor_LSTM],last) 

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model_dir = './model'
if not os.path.exists(model_dir):
    os.mkdir(model_dir)
model_path = model_dir + "/concatenate.model"
checkpoint = ModelCheckpoint(filepath=model_path, monitor="val_loss", verbose=1, save_best_only=True)

early_stopping = EarlyStopping(monitor='val_loss', patience=20)

history = model.fit([X_train_CNN,X_train], y_train, batch_size=128, epochs=100, validation_split=0.2, 
callbacks=[checkpoint, early_stopping])

Код, указанный на top - это модель, которую я реализовал, и когда я использую функцию подгонки, появляется следующая ошибка.

-> Ошибка при проверке цели: ожидалось, что плотный_89 будет иметь 2 измерения, но получил массив с формой (3686, 20, 2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...