使用ImageDataGenerator训练CNN时第二轮Epoch触发AttributeError
使用ImageDataGenerator训练CNN时第二轮Epoch触发AttributeError
训练基于ImageDataGenerator的CNN模型时,第二轮Epoch结束后抛出AttributeError: 'NoneType' object has no attribute 'items'错误。
模型代码
import tensorflow as tf from tensorflow.keras.optimizers import RMSprop def create_model(): '''创建包含4个卷积层的CNN模型''' model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 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.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=RMSprop(learning_rate=1e-4), metrics=['accuracy']) return model from tensorflow.keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_dir, # 训练图像源目录 target_size=(150, 150), # 所有图像将被调整为150x150 batch_size=20, # 使用binary_crossentropy损失,因此需要二进制标签 class_mode='binary') validation_generator = test_datagen.flow_from_directory( validation_dir, target_size=(150, 150), batch_size=20, class_mode='binary', shuffle= False) EPOCHS = 20 model = create_model() history = model.fit( train_generator, steps_per_epoch=100, # 2000张图像 = batch_size * steps epochs=EPOCHS, validation_data=validation_generator, validation_steps=50, # 1000张图像 = batch_size * steps verbose=2)
报错信息
AttributeError Traceback (most recent call last) Cell In[15], line 8 5 model = create_model() 7 # 训练模型 ----> 8 history = model.fit( 9 train_generator, 10 steps_per_epoch=100, # 2000 images = batch_size * steps 11 epochs=EPOCHS, 12 validation_data=validation_generator, 13 validation_steps=50, # 1000 images = batch_size * steps 14 verbose=2) File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\keras\src\utils\traceback_utils.py:122, in filter_traceback.<locals>.error_handler(*args, **kwargs) 119 filtered_tb = _process_traceback_frames(e.__traceback__) 120 # 如需查看完整堆栈跟踪,请调用: 121 # `keras.config.disable_traceback_filtering()` --> 122 raise e.with_traceback(filtered_tb) from None 123 finally: 124 del filtered_tb File ~\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\keras\src\backend\tensorflow\trainer.py:354, in TensorFlowTrainer.fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq) 333 self._eval_epoch_iterator = TFEpochIterator( 334 x=val_x, 335 y=val_y, ... 355 } 356 epoch_logs.update(val_logs) 358 callbacks.on_epoch_end(epoch, epoch_logs) AttributeError: 'NoneType' object has no attribute 'items' 输出已截断。可查看滚动元素或在文本编辑器中打开。调整单元格输出设置...
已尝试的调试步骤
- 升级TensorFlow与Keras版本;
- 搭建更简单的神经网络,可正常运行;
- 手动使用numpy处理验证数据而非直接传入validation_generator,但训练数据的准确率和损失值仅在偶数轮Epoch时为0,问题仍未解决。
已确认验证数据已正常加载。
环境版本信息
- Python 3.11.9
- TensorFlow 2.17.0
- Keras 3.4.1
内容的提问来源于Stack Exchange,提问作者Darshil Pungalia
相关产品推荐
相关产品推荐

