【问题标题】:Why tf.keras loss becomes NaN when number of train images increases from 100 to 9000?当训练图像的数量从 100 增加到 9000 时,为什么 tf.keras 损失变为 NaN?
【发布时间】: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_lossloss 一切正常,如下图所示

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_lossloss 变为 NaN

Epoch 1/10
307/307 [==============================] - 20s 63ms/step - loss: nan - accuracy: 0.0090 - val_loss: nan - val_accuracy: 0.0000e+00

trainGeneratorvalidationGenertor 中的批处理大小在上述两种情况下都是 32(默认值)。

当我使用 trainGeneratorvalidationGenertor 导入图像时,我已经重新缩放了图像

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_lossval_accuracy 中得到NaN 是0?
  2. 如何解决此问题,以便它可以处理训练集中的更多图像?

【问题讨论】:

  • 请显示生成器的代码。你是从目录唱流还是从数据框唱流?
  • @GerryP,我在上面为生成器添加了代码。我正在使用flow_from_dataframe。任何建议表示赞赏。谢谢。

标签: python image tensorflow keras computer-vision


【解决方案1】:

我要做的是使用分类交叉熵。在您的生成器中,将 class_mode 更改为“分类”。在 model.compile 中使 loss='categorical_crossentropy。不确定这会解决它,但它不会受到伤害。可能是当你使用更多图像时,也许有一些 Na 标签。检查 Na 的数据名。

【讨论】:

  • 我尝试过分类交叉熵。我从val_lossval_accuracy 获得了一些价值,但是尽管我使用了 200 个 epoch,但所有 epoch 的两个值都保持不变。有什么建议吗?
  • 我怀疑问题可能出在数据集上。你用的是什么数据集?
  • 我正在使用私有图像日期集,很遗憾由于保密协议无法在此处共享。我已接受您的回答,因为我在 val_lossval_accuracy 中获得了一些价值。我会调整模型层并提出一个单独的问题,如果有的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2021-06-14
  • 2022-06-14
  • 2022-10-12
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多