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

Keras训练VGG-16模型后如何保存与加载权重?报错求解

在Keras中保存和加载VGG-16模型权重的正确方法

我来帮你搞定Keras里VGG-16权重保存、加载的问题,顺便解决你碰到的那个NameError:

一、保存训练好的VGG-16权重

训练完成后,直接调用模型的save_weights()方法就能把权重存下来,示例代码如下:

# 假设你已经完成训练的模型是custom_vgg_model
custom_vgg_model.save_weights("weights-Test-CNN.hdf5")

# 如果要指定保存路径(比如存到项目下的models文件夹),可以写:
# custom_vgg_model.save_weights("./models/weights-Test-CNN.hdf5")

.hdf5(或简写为.h5)是Keras常用的权重文件格式,会把模型的所有权重参数打包保存到这个文件里。

二、加载保存的权重到模型中

加载权重有个关键前提:你必须先构建好和保存权重时结构完全一致的模型(比如你的custom_vgg_model要先定义好,层的数量、输入输出形状、层名称都得匹配)。然后用load_weights()方法加载,注意文件路径一定要用引号包裹:

# 先构建和之前一致的模型结构,比如基于VGG16自定义的模型
from keras.applications import VGG16
custom_vgg_model = VGG16(weights=None, include_top=False, input_shape=(224,224,3))

# 加载权重
custom_vgg_model.load_weights("weights-Test-CNN.hdf5", by_name=False)

如果权重文件不在当前脚本的工作目录下,记得写完整的绝对路径,比如:

custom_vgg_model.load_weights("/Users/yourname/projects/weights-Test-CNN.hdf5", by_name=False)

三、解决你遇到的NameError问题

看你给出的报错代码:

custom_vgg_model.load_weights(weights-Test-CNN.hdf5, by_name=False)

问题出在weights-Test-CNN.hdf5没有用引号包裹!Python会把这个表达式错误解析成「变量weights 减去 变量Test 减去 变量CNN.hdf5」,但你根本没定义这些变量,所以才会报NameError: name 'weights' is not defined。

只需要把文件名用双引号或单引号括起来,让Python识别它是一个字符串路径就可以了,修正后的代码就是上面提到的正确写法。

额外实用提示

  • 如果你的模型是在原VGG-16基础上做了修改(比如添加/删除层),可以用by_name=True参数,这样Keras会根据层的名称来匹配加载权重,而不是严格按层的顺序匹配:
    custom_vgg_model.load_weights("weights-Test-CNN.hdf5", by_name=True)
    
  • 如果你想保存整个模型(包括结构、权重、优化器状态),可以用model.save("full_model.h5"),加载时用from keras.models import load_model; model = load_model("full_model.h5"),这种方式更省心,适合需要完整恢复训练状态的场景。

内容的提问来源于stack exchange,提问作者A Santosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:57:38