TensorFlow训练猫狗分类CNN出现0xC0000409错误求助
问题分析与解决
错误码 Process finished with exit code -1073740791 (0xC0000409) 在Windows环境下通常指向内存访问冲突,大概率由内存不足、数据加载逻辑错误或参数配置不当引发。结合你的代码,核心问题及修复方案如下:
1. model.fit 参数配置错误
你将 steps_per_epoch 设置为 len(test_it),这是完全错误的:
steps_per_epoch应等于训练集迭代器的长度(len(train_it)),表示每轮训练需遍历完所有训练数据validation_steps才对应测试/验证集迭代器的长度(len(test_it))
该错误会导致训练时尝试读取远超训练集的数据量,直接触发内存溢出。
2. 废弃API的使用
evaluate_generator 已被官方废弃,建议改用 model.evaluate,它现在支持直接传入数据生成器。
3. 内存占用过高
200×200的输入尺寸搭配64的batch_size,对内存/GPU显存压力较大,容易触发崩溃。可先降低batch_size(如改为16或32)测试。
4. 环境兼容性问题
Python3.7搭配独立Keras库可能存在适配问题,优先使用 tf.keras(TensorFlow集成的Keras模块),兼容性更稳定。
修正后的完整代码
# baseline model for the dataset import sys from matplotlib import pyplot from tensorflow.keras.utils import to_categorical from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D from tensorflow.keras.layers import MaxPool2D from tensorflow.keras.layers import Dense from tensorflow.keras.layers import Flatten from tensorflow.keras.optimizers import SGD from tensorflow.keras.preprocessing.image import ImageDataGenerator # define cnn model def define_model(): model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(200, 200, 3))) model.add(MaxPool2D((2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu', kernel_initializer='he_uniform')) model.add(Dense(1, activation='sigmoid')) # 统一优化器配置(原代码定义了SGD但实际用了adam,此处保留adam) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.summary() return model # run the test harness for evaluating a model def run_test_harness(): # define model model = define_model() # create data generator datagen = ImageDataGenerator(rescale=1.0 / 255.0) # prepare iterators - 降低batch_size减少内存占用 train_it = datagen.flow_from_directory('data_dogs_vs_cats/train', class_mode='binary', batch_size=32, target_size=(200, 200)) test_it = datagen.flow_from_directory('data_dogs_vs_cats/val', class_mode='binary', batch_size=32, target_size=(200, 200)) # fit model - 修正steps_per_epoch参数 history = model.fit(train_it, steps_per_epoch=len(train_it), validation_data=test_it, validation_steps=len(test_it), epochs=20, verbose=1) # 开启verbose查看训练过程 # evaluate model - 用evaluate替代废弃的evaluate_generator _, acc = model.evaluate(test_it, steps=len(test_it), verbose=0) print('> %.3f' % (acc * 100.0)) # entry point run_test_harness()
额外排查步骤
- 验证数据集路径:确保
data_dogs_vs_cats/train和val目录下存在dogs、cats两个子文件夹,且内部有有效图片 - 释放内存资源:关闭其他占用内存/GPU显存的程序,避免资源不足
- 缩小输入尺寸:尝试将
target_size改为(100,100),进一步降低内存压力
内容的提问来源于stack exchange,提问作者FerdyG
相关产品推荐
相关产品推荐

