使用MobileNetV2迁移学习做回归预测时输出维度异常求助
解决MobileNetV2迁移学习回归任务输出维度异常问题
我是迁移学习新手,尝试用预训练MobileNetV2解决回归问题,需要预测8个输出值,但训练后预测100个测试样本时,得到的却是MobileNetV2原输出层的7x7x1280维度结果,而非期望的8个值。以下是实现迁移学习的代码(因output_1和output_2分布不同,构建了两个输出层):
# Define MSE model with transfer learning base_model_MSE = tf.keras.applications.MobileNetV2(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) x = base_model_MSE.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation='relu')(x) x = Dense(512, activation='relu')(x) x = Dense(256, activation='relu')(x) x = Dense(128, activation='relu')(x) output_1 = Dense(6, activation='sigmoid', name='output_1')(x) output_2 = Dense(2, name='output_2')(x) # Define the final model with transfer learning final_model_MSE = Model(inputs=base_model_MSE.input, outputs=[output_1, output_2]) # Print the model summary final_model_MSE.summary() # Freeze the base model layers for layer in base_model_MSE.layers: layer.trainable = False # Print the model summary final_model_MSE.summary() # Compile the model final_model_MSE.compile(optimizer=Adam(lr=0.001), loss={'output_1': 'mse', 'output_1': 'mse'}, metrics={'output_2': 'mae', 'output_2': 'mae'}) # Fit the model history_MSE = final_model_MSE.fit(train_data_resized, {'output_1': train_labels[:, :6], 'output_2': train_labels[:, 6:]}, epochs=25, batch_size=64, validation_data=( val_data_resized, {'output_1': val_labels[:, :6], 'output_2': val_labels[:, 6:]}), verbose=1)
训练数据train_data_resized维度为4000x224x224x3,验证数据val_data_resized为1000x224x224x3,以下是解决输出维度异常的方法:
修正模型编译时的字典键错误
代码中compile函数的loss和metrics字典存在重复键,漏掉了对应输出层的配置:- loss字典重复设置
output_1的损失,未配置output_2 - metrics字典重复设置
output_2的指标,未配置output_1
这会导致模型编译异常,无法正确关联自定义输出层。修正后的编译代码:
final_model_MSE.compile(optimizer=Adam(lr=0.001), loss={'output_1': 'mse', 'output_2': 'mse'}, metrics={'output_1': 'mae', 'output_2': 'mae'})- loss字典重复设置
确认预测时调用的是最终模型
检查预测代码,确保调用final_model_MSE.predict(test_data)而非base_model_MSE.predict(test_data)。若误调用基础模型,会直接返回其7x7x1280的特征图输出。验证模型结构正确性
查看final_model_MSE.summary()的输出,确认模型输出层为output_1(6维)和output_2(2维)。同时确保正确导入Model类:from tensorflow.keras.models import Model。统一测试数据预处理
确保测试数据与训练/验证数据的预处理一致:- 输入维度保持(224,224,3)
- 使用
tf.keras.applications.mobilenet_v2.preprocess_input处理输入,匹配MobileNetV2的输入要求。
内容的提问来源于stack exchange,提问作者Engineer90
相关产品推荐
相关产品推荐

