You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:18:01