【发布时间】:2021-04-02 22:50:32
【问题描述】:
我正在关注here 中的一个 CNN 示例。 这是我准备 CNN 模型的代码:
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(7)) # 7 outputs for 7 classes which are 1, 2, 3, ..., 7
这就是我训练模型的方式:
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
history = model.fit(trainGenerator, epochs=10,
validation_data=validationGenerator)
当trainGenerator 有 80 张图片和 validationGenerator 有 20 张图片时,val_loss 和 loss 一切正常,如下图所示
Epoch 1/10
3/3 [==============================] - 1s 736ms/step - loss: 1.8475 - accuracy: 0.2500 - val_loss: 2.4287 - val_accuracy: 0.5500
当trainGenerator 得到 9817 张图片和 validationGenerator 得到 2454 张图片时,val_loss 和 loss 变为 NaN
Epoch 1/10
307/307 [==============================] - 20s 63ms/step - loss: nan - accuracy: 0.0090 - val_loss: nan - val_accuracy: 0.0000e+00
trainGenerator 和validationGenertor 中的批处理大小在上述两种情况下都是 32(默认值)。
当我使用 trainGenerator 和 validationGenertor 导入图像时,我已经重新缩放了图像
trainDataGen=ImageDataGenerator(
rescale=1./255,
validation_split=0.2
)
之后我使用flow_from_dataframe 创建trainGenerator,如下所示:
trainGenerator = trainDataGen.flow_from_dataframe(
dataframe=train_df,
directory=trainingFilepath,
x_col="filename",
y_col="label",
target_size=(100,100),
class_mode="raw",
subset="training"
)
validationGenerator 是使用上面的代码通过将子集替换为validation 而创建的
已询问过类似的question,但它不适用于我的情况,因为当火车图像数量增加并且我使用sparce_categorical_crossentropy时问题仍然存在
- 为什么我在
val_loss和val_accuracy中得到NaN是0? - 如何解决此问题,以便它可以处理训练集中的更多图像?
【问题讨论】:
-
请显示生成器的代码。你是从目录唱流还是从数据框唱流?
-
@GerryP,我在上面为生成器添加了代码。我正在使用
flow_from_dataframe。任何建议表示赞赏。谢谢。
标签: python image tensorflow keras computer-vision