NameError: name 'Model'未定义 使用InceptionResNetV2做迁移学习如何解决?
报错原因与修复
你触发报错有两个核心问题,同时原有实现逻辑存在遗漏:
- 未导入
Model类触发NameError,可直接调用tf.keras.Model,或提前执行from tf.keras.models import Model导入 - 预训练模型实例化后的变量名为
irv2,构造模型时错误使用了未定义的mobile变量作为输入源 - 原有逻辑未真正移除最后一层:你取
layers[-1].output仍是原模型最后一层的输出,需改为取倒数第二层输出
修复后的可运行代码如下:
import tensorflow as tf from tensorflow.keras.layers import Dropout, Dense from tensorflow.keras.models import Model # 加载预训练模型 irv2 = tf.keras.applications.inception_resnet_v2.InceptionResNetV2() irv2.summary() # 取倒数第二层输出,添加自定义层 x = irv2.layers[-2].output x = Dropout(0.25)(x) predictions = Dense(2, activation='softmax')(x) # 构造最终模型 model = Model(inputs=irv2.input, outputs=predictions)
其他移除最后一层并添加自定义层的实现方法
- 方法1:加载预训练模型时指定
include_top=False(官方推荐迁移学习用法)
加载时直接跳过原模型的全连接输出层,无需手动删除,适配绝大多数迁移学习场景,代码如下:
irv2 = tf.keras.applications.inception_resnet_v2.InceptionResNetV2( include_top=False, # 不加载顶部全连接分类层 weights='imagenet', input_shape=(299,299,3), pooling='avg' # 自动添加全局平均池化层输出一维特征 ) # 可选:冻结预训练层权重 irv2.trainable = False # 直接拼接自定义分类头 model = tf.keras.Sequential([ irv2, Dropout(0.25), Dense(2, activation='softmax') ])
- 方法2:使用
pop()方法直接删除模型最后一层
操作更简洁,适合需要保留原有模型全部配置、仅删除最后一层的场景,代码如下:
irv2 = tf.keras.applications.inception_resnet_v2.InceptionResNetV2() irv2.pop() # 直接删除最后一层全连接分类层 # 添加自定义层 x = Dropout(0.25)(irv2.output) predictions = Dense(2, activation='softmax')(x) model = Model(inputs=irv2.input, outputs=predictions)
内容的提问来源于stack exchange,提问作者Md Mahadi Hasan Sany
相关产品推荐
相关产品推荐

