【问题标题】:Keras loss: 0.0000e+00 and accuracy stays constantKeras 损失:0.0000e+00 且准确度保持不变
【发布时间】:2022-01-05 08:46:51
【问题描述】:

我有 0-100 个包含合成训练图像的 101 个文件夹。 这是我的代码:

dataset = tf.keras.utils.image_dataset_from_directory(
'Pictures/synthdataset5', labels='inferred', label_mode='int', class_names=None, color_mode='rgb', batch_size=32, image_size=(128,128), shuffle=True, seed=None, validation_split=None, subset=None,interpolation='bilinear', follow_links=False,crop_to_aspect_ratio=False
)

from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten

model = Sequential()

model.add(Conv2D(32, kernel_size=5, activation='relu', input_shape=(128,128,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=5, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, kernel_size=3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(256, kernel_size=3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(dataset,epochs=75)

而且我总是在每个时期得到相同的结果:

Epoch 1/75
469/469 [==============================] - 632s 1s/step - loss: 0.0000e+00 - accuracy: 0.0098

怎么了???

【问题讨论】:

  • 嗨@查理。您需要分类多少个标签?
  • 嗨@Charlie,你能描述一下你的数据集吗?比如有多少标签/类,你想预测什么等?乍一看,您的最后一层中的第 th 类可能有错误的激活函数和错误的输出数,磨损的损失函数或您的合成数据可能不足以学习。
  • 所以我不知道类和标签之间的术语,但基本上我试图猜测图像中水果的数量。共有101个文件夹,文件夹中的每张图片都有文件夹名称中的水果数量。文件夹名称从 0 到 100。总共有15000张图片。对不起,我对此很陌生:)
  • @fabian 这似乎不是巧合,因为它总是 0.0098 的准确度,这是随机猜测所期望的,或者更有可能总是选择相同的数字。但是我不知道如何更改最后一层的大小,因为如果我从 model.add(Dense(1, activation='sigmoid')) 中的一个更改它,它会出错,尽管我认为它不是维度大小长度
  • @adarshwase 它说从 101 个类别中找到了 15000 张图像

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

事实证明,你的损失毕竟可能是问题所在。 如果您使用 SparseCategoricalCrossentropy 作为损失,它应该可以工作。

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

在此之后,您应该将最后一层调整为:

model.add(Dense(101, activation='softmax'))

别忘了导入import tensorflow as tf 让我知道这是否能解决问题。

【讨论】:

  • 它会抛出一个来自 logits=true 的错误,但输出参数是由 softmax 产生的,因此不代表 logits。它确实可以训练,但这会影响效率吗?
  • 你应该用 from_logits=true 删除部分...只需用 tf.keras.losses.SparseCategoricalCrossentropy() 替换它,因为这里没有 logits 张量 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多