调用Keras ImageDataGenerator.next()报scipy未定义错误
问题根因
Keras的ImageDataGenerator实现旋转、平移、剪切、缩放这类仿射变换类图像增强逻辑时,依赖SciPy库的ndimage模块。你遇到的NameError: name 'scipy' is not defined由两类问题触发:
- 运行环境未安装SciPy依赖
- 已安装的SciPy版本与当前Keras版本不兼容:SciPy 1.8.0及以上版本调整了内部模块结构,旧版Keras的动态导入逻辑执行失败,没有成功将
scipy注册到全局命名空间,触发变量未定义错误。
解决步骤
- 安装兼容版本的SciPy
激活你当前使用的jupyter-venv虚拟环境,执行以下命令安装适配Python3.8、兼容旧版Keras导入逻辑的SciPy版本:pip install scipy==1.7.3 - 补全代码缺失的导入、统一接口
你提供的示例代码中直接调用了tf.keras接口加载图片,但未导入TensorFlow,运行时会额外触发tf未定义报错,需要在代码开头补充导入语句:
另外你的代码混用了独立Keras和import tensorflow as tftensorflow.keras的图像预处理接口,容易出现参数不匹配、序列化失败等兼容问题,建议统一导入路径:要么全部使用tf.keras.preprocessing下的对应模块,要么全部使用独立安装的Keras的对应接口。 - 高版本SciPy适配方案(可选)
如果你必须使用1.8.0以上版本的SciPy,不需要降级,直接修改Keras源码即可:- 打开报错栈中提示的路径
~/jupyter-venv/lib/python3.8/site-packages/keras/preprocessing/image.py - 找到文件开头的SciPy动态导入代码块,默认是如下写法:
try: import scipy except ImportError: scipy = None - 将其替换为显式导入:
import scipy from scipy import ndimage - 再定位到同文件内的
apply_affine_transform函数,把所有scipy.ndimage开头的调用直接替换为ndimage,保存文件即可。
- 打开报错栈中提示的路径
验证
完成上述操作后重新运行代码,随机旋转增强逻辑可以正常执行,批量生成增强图像并完成绘制,不会再抛出scipy相关报错。
内容的提问来源于stack exchange,提问作者Matthew Fernandez
相关产品推荐
相关产品推荐

