VGG16迁移学习建模时出现NameError: name 'scipy' is not defined
报错原因
这个NameError: name 'scipy' is not defined报错和数据集、VGG16模型本身无关,核心原因是你当前pyenv管理的Python 3.9.7环境里没有安装scipy依赖库。Keras自带的ImageDataGenerator执行图像预处理的仿射变换逻辑时强依赖scipy,环境里缺这个包就会在启动训练、走到预处理逻辑时抛出未定义错误。
你没看到教程里展示的预训练权重下载流程是正常的:本地已经缓存过VGG16的预训练权重文件,不需要重复下载。
解决方法
- 先在当前pyenv的3.9.7环境下安装scipy依赖,考虑到你是M1芯片+Python3.9的环境,直接安装兼容性最好的1.7.3版本即可,终端执行命令:
pip install scipy==1.7.3 - 你代码里用的
model.fit_generator已经在新版Keras里被弃用了,直接把这部分替换成model.fit就行,功能完全一致,改完的训练代码段如下:
hist = model.fit(train_data, steps_per_epoch=1600//batch_size, epochs=25, validation_data= test_data, validation_steps=800//batch_size)
- 等训练跑完,你要导出.json格式的模型结构和.h5格式的权重的话,在代码末尾加这几行就行:
# 导出模型结构为json文件 model_structure = model.to_json() with open("fruit_classify_model.json", "w") as f: f.write(model_structure) # 导出模型权重为h5文件 model.save_weights("fruit_classify_weight.h5")
其他说明
日志里提示的
pyenv: shell integration not enabled不影响当前脚本运行,如果之后需要用pyenv快速切换终端默认Python版本,执行pyenv init按照终端给出的提示修改shell配置文件即可。
内容的提问来源于stack exchange,提问作者Atakan Sever
相关产品推荐
相关产品推荐

