python - 如何使用预训练模型进行双输入迁移学习
问题描述
我将使用预训练模型(之前使用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)
line 似乎会导致错误。
我要做的就是使用预训练模型(“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])
解决方案
这里是正确的方法。当我定义时,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()
推荐阅读
- express - express-session:会话在其他路由中不可访问
- android - flutter_blue 获取当前设备蓝牙MAC地址
- pandas - 如何切片 pandas.DataFrame?
- php - 发布数据为空时如何显示所有数据mySQL
- node.js - Knex 与 Heroku Postgres 连接出现错误?
- algorithm - 寻找按字母匹配单词的数据结构
- php - 未验证 reCAPTCHA 时提交注册表单
- java - 尝试使用 Tab 在 JTextFields 之间垂直跳转(使用自定义 FocusTraversalPolicy)
- javascript - Chrome 扩展开发:不断出现 Unchecked runtime.lastError: 无法建立连接。接收端不存在
- java - 如何从java中的任何目录和对话框中读取文本文件?