Keras训练CNN时出现“输入数据耗尽”警告及部分轮次损失/准确率为0的问题求助
Keras训练CNN时出现“输入数据耗尽”警告及部分轮次损失/准确率为0的问题求助
大家好,我最近在用Keras训练CNN模型时碰到了一个棘手的问题,想请各位帮忙分析一下。
我用ImageDataGenerator处理数据集,训练集一共有1500张图片,设置的batch size是32,所以计算出来的steps_per_epoch是⌈1500/32⌉=47(最后一个批次是不完整的),通过flow_from_directory()方法加载图片。但训练开始后,部分epoch直接显示损失和准确率为0,还弹出了“输入数据耗尽”的警告,训练也被中断,具体警告如下:
UserWarning: Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least
steps_per_epoch * epochsbatches. You may need to use the .repeat() function when building your dataset.
self.gen.throw(typ, value, traceback)
以下是我的完整代码:
train_datagen = ImageDataGenerator(rescale=1./255) valid_datagen = ImageDataGenerator(rescale=1./255) # 从目录导入数据并转换为批次 train_data = train_datagen.flow_from_directory(train_path, batch_size=32, target_size=(224, 224), class_mode="binary") valid_data = valid_datagen.flow_from_directory(test_path, batch_size=32, target_size=(224, 224), class_mode="binary") tf.random.set_seed(42) model_1 = tf.keras.models.Sequential([ Input(shape=(224, 224, 3)), Conv2D(filters=10, kernel_size=3, strides=1, padding='valid', activation='relu'), Conv2D(10, 3, activation='relu'), Conv2D(10, 3, activation='relu'), Flatten(), Dense(1, activation='sigmoid') ]) model_1.compile(loss="binary_crossentropy", optimizer=tf.keras.optimizers.Adam(), metrics=["accuracy"]) history_1 = model_1.fit(train_data, epochs=5, steps_per_epoch=len(train_data), validation_data=valid_data, validation_steps=len(valid_data))
训练的输出日志如下:
Epoch 1/5 /usr/local/lib/python3.11/dist-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:122: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored. self._warn_if_super_not_called() 47/47 ━━━━━━━━━━━━━━━━━━━━ 767s 14s/step - accuracy: 0.6488 - loss: 0.6197 - val_accuracy: 0.7620 - val_loss: 0.4793 Epoch 2/5 47/47 ━━━━━━━━━━━━━━━━━━━━ 0s 426us/step - accuracy: 0.0000e+00 - loss: 0.0000e+00 Epoch 3/5 /usr/lib/python3.11/contextlib.py:158: UserWarning: Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches. You may need to use the `.repeat()` function when building your dataset. self.gen.throw(typ, value, traceback) 47/47 ━━━━━━━━━━━━━━━━━━━━ 48s 224ms/step - accuracy: 0.8120 - loss: 0.4131 - val_accuracy: 0.8600 - val_loss: 0.3441 Epoch 4/5 47/47 ━━━━━━━━━━━━━━━━━━━━ 3s 54ms/step - accuracy: 0.0000e+00 - loss: 0.0000e+00 Epoch 5/5 47/47 ━━━━━━━━━━━━━━━━━━━━ 11s 219ms/step - accuracy: 0.8336 - loss: 0.3814 - val_accuracy: 0.8880 - val_loss: 0.3042
有没有大佬能帮我看看这是什么原因导致的?该怎么解决这个问题呢?
备注:内容来源于stack exchange,提问作者Hamza Azhar
相关产品推荐
相关产品推荐

