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
相关产品推荐
相关产品推荐

