使用TensorFlow 2.15.0 GPU训练猫狗识别CNN模型遇scipy未定义错误
问题描述
我正在使用TensorFlow 2.15.0 GPU训练一个CNN模型实现猫狗识别,运行程序时出现错误:NameError: name 'scipy' is not defined。
数据生成器
数据集可通过Kaggle获取,代码如下:
train_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) # 加载训练数据 train_generator = train_datagen.flow_from_directory( train_dir, target_size=(64, 64), batch_size=20, class_mode='binary' ) # 加载验证数据 test_generator = test_datagen.flow_from_directory( test_dir, target_size=(64, 64), batch_size=20, class_mode='binary' )
模型
模型包含3个卷积层和2个全连接层,构建与编译代码:
# 构建模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(128, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) # 编译模型 model.compile(loss='binary_crossentropy', optimizer=Adam(learning_rate=1e-4), metrics=['acc'])
训练报错
运行到以下训练代码时出现错误:
history = model.fit_generator( train_generator, steps_per_epoch=400, epochs=20, validation_data=test_generator, validation_steps=100, verbose=2 )
错误栈信息:
Traceback (most recent call last): File "/home/liu/tensor/demo2/test1.py", line 65, in <module> history = model.fit_generator( File "/home/liu/tensor/tensor_venv/lib/python3.10/site-packages/keras/src/engine/training.py", line 2913, in fit_generator return self.fit( File "/home/liu/tensor/tensor_venv/lib/python3.10/site-packages/keras/src/utils/traceback_utils.py", line 70, in error_handler raise e.with_traceback(filtered_tb) from None File "/home/liu/tensor/tensor_venv/lib/python3.10/site-packages/keras/src/preprocessing/image.py", line 2526, in apply_affine_transform if scipy is None: NameError: name 'scipy' is not defined
疑问
- 是否需要手动安装
scipy?但感觉不该出现这种情况。 fit_generator()函数是否和Python 3.10存在兼容性问题?- 是否是图片格式不正确导致的?
解决方案
1. 必须手动安装scipy
从错误栈能看到,Keras的apply_affine_transform函数会检查scipy是否存在——即便你没显式使用数据增强,TensorFlow/Keras的部分内部逻辑也依赖scipy。直接在虚拟环境里执行安装命令:
pip install scipy
2. 替换fit_generator为fit
fit_generator在TensorFlow 2.x版本后已被废弃,虽然它内部会调用fit,但更推荐直接使用model.fit(),避免潜在的兼容性问题。修改训练代码为:
history = model.fit( train_generator, steps_per_epoch=400, epochs=20, validation_data=test_generator, validation_steps=100, verbose=2 )
该问题和Python 3.10无直接兼容性关联,主要是函数废弃带来的潜在风险。
3. 图片格式问题可排除
错误明确指向scipy未定义,和图片格式无关。如果后续出现图片加载错误,再去检查数据集里的图片是否损坏或格式不兼容。
内容的提问来源于stack exchange,提问作者NoError
相关产品推荐
相关产品推荐

