как использовать предварительно обученную модель для обучения с двойным вводом

#python #tensorflow #machine-learning #keras #deep-learning

#python #тензорный поток #машинное обучение #keras #глубокое обучение

Вопрос:

Я собираюсь использовать предварительно обученную модель (которая была ранее сохранена с использованием save_best_only аргумента ModelCheckpoint ) для обучения передаче с двойным вводом. У меня есть следующее:

 pretrained_model = load_model('best_weight.h5')

def combined_net(): 
    
    u_model = pretrained_model
    u_output = u_model.layers[-1].output
    
    v_model = pretrained_model
    v_output = v_model.layers[-1].output


    concat = concatenate([u_output, v_output])
    #hidden1 = Dense(64, activation=activation)(concat) #was 128
    main_output = Dense(1, activation='sigmoid', name='main_output')(concat) # pretrained_model.get_layer("input_1").input

    model = Model(inputs=[u_model.input, v_model.input], outputs=main_output)
    opt = SGD(lr=0.001, nesterov=True)
    model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
    return model
  

И когда я пытаюсь подогнать, используя:

 best_weights_file="weights_best_of_pretrained_dual.hdf5"
checkpoint = ModelCheckpoint(best_weights_file, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks = [checkpoint]

base_model = combined_net()
print(base_model.summary)

history = base_model.fit([x_train_u, x_train_v], y_train,
                         batch_size=batch_size,
                         epochs=epochs,
                         callbacks=callbacks, 
                         verbose=1,
                         validation_data=([x_test_u, x_test_v], y_test), 
                         shuffle=True)
  

У меня следующая ошибка:

ValueError: The list of inputs passed to the model is redundant. All inputs should only appear once. Found: [<tf.Tensor 'input_1_5:0' shape=(None, None, None, 3) dtype=float32>, <tf.Tensor 'input_1_5:0' shape=(None, None, None, 3) dtype=float32>]

По-видимому, model = Model(inputs=[u_model.input, v_model.input], outputs=main_output) строка, похоже, вызывает ошибку.

Все, что я хочу сделать, это использовать предварительно обученную модель («best_weight.h5») для модели с двойным вводом и одним выходом. Оба входных сигнала совпадают с ранее инициализированными, и concatenate слой должен объединить слои перед последним слоем каждой модели, построенной загруженной моделью.

Я попробовал несколько способов, которые нашел в Интернете, но не смог правильно настроить модель.

Я надеюсь, что кто-то может мне помочь

Редактировать:

Предварительно обученная модель показана ниже:

 def vgg_16():
    b_model = VGG16(weights='imagenet', include_top=False)
    x = b_model.output
    x = GlobalAveragePooling2D()(x)
    x = Dense(256, activation=activation)(x)
    predictions = Dense(1, activation='sigmoid')(x)
    model = Model(inputs=b_model.input, outputs=predictions)
    for layer in model.layers[:15]:  #
        layer.trainable = False
    opt = SGD(lr=init_lr, nesterov=True)
    model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
    return model

main_model = vgg_16()
history = main_model.fit(X_train, y_train, batch_size=batch_size, 
          epochs=EPOCHS, validation_data=(X_test, y_test), verbose=1, 
          callbacks=[es, mc, l_r])
  

Ответ №1:

вот правильный способ сделать это. когда я определяю combined_net , я определяю 2 новых входа, которые используются для подачи pre_trained модели таким же образом

 def vgg_16():
    
    b_model = tf.keras.applications.VGG16(weights='imagenet', include_top=False)
    x = b_model.output
    x = GlobalAveragePooling2D()(x)
    x = Dense(256, activation='relu')(x)
    predictions = Dense(1, activation='sigmoid')(x)
    model = Model(inputs=b_model.input, outputs=predictions)
    
    for layer in model.layers[:15]:
        layer.trainable = False
        
    opt = SGD(lr=0.003, nesterov=True)
    model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
    
    return model

main_model = vgg_16()
# main_model.fit(...)

pretrained_model = Model(main_model.input, main_model.layers[-2].output)

def combined_net(): 
    
    inp_u = Input((224,224,3)) # the same input dim of pretrained_model
    inp_v = Input((224,224,3)) # the same input dim of pretrained_model
    
    u_output = pretrained_model(inp_u)
    v_output = pretrained_model(inp_v)


    concat = concatenate([u_output, v_output])
    main_output = Dense(1, activation='sigmoid', name='main_output')(concat)

    model = Model(inputs=[inp_u, inp_v], outputs=main_output)
    opt = SGD(lr=0.001, nesterov=True)
    model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
    return model

base_model = combined_net()
base_model.summary()