当列车图像数量从100增加到9000时,为什么tf.keras损失变为NaN?

2024-04-25 09:50:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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个图像,对于{}&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

  1. 为什么我在{}中得到{}&val_accuracy是0吗
  2. 我如何修复它,使其能够处理列车组中的更多图像

Tags: from图像adddataframemodellayersvalactivation
1条回答
网友
1楼 · 发布于 2024-04-25 09:50:14

我要做的是使用分类交叉熵。在生成器中,将class_模式更改为“分类”。在model.compile中,使损失class='classifical\u交叉熵。不确定这是否能解决问题,但不会造成伤害。可能是当你使用更多的图片时,可能有一些Na 标签。检查您的datafame是否有Na

相关问题 更多 >