【问题标题】:为什么我的模型只用了一层 softmax 就可以达到 100% 的准确率?
【发布时间】:2022-01-23 04:24:00
【问题描述】:

我接到了一项任务,要学习如何创建一个可以对图像进行分类的模型。 在制作了一个之后,我得到了 100% 的准确率,所以我决定减少我的模型层,直到我做得更糟。我删除了输入数据、Conv2D 层、MaxPooling2D 层和 Dense Hidden 层的规范化。

我现在已经达到了我认为的基本原理,但我仍然得到 100% 的准确度,我严重怀疑这是否准确。对测试数据进行手动抽查似乎通过了,但我不知道为什么。

运行时我得到的唯一警告是2021-12-21 14:05:19.952543: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.

我的模特

model = keras.Sequential()
model.add(keras.Input(shape=(IMG_WIDTH, IMG_HEIGHT, 3,)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(NUM_CATEGORIES, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.summary()

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 flatten (Flatten)           (None, 2700)              0         
                                                                 
 dense (Dense)               (None, 43)                116143    
                                                                 
=================================================================
Total params: 116,143
Trainable params: 116,143
Non-trainable params: 0
_________________________________________________________________
None

model.fit(x_train, y_train, epochs=EPOCHS)

Epoch 1/10
500/500 [==============================] - 1s 2ms/step - loss: 32.7355 - accuracy: 0.8956
Epoch 2/10
500/500 [==============================] - 1s 2ms/step - loss: 3.2202e-07 - accuracy: 1.0000
Epoch 3/10
...
Epoch 9/10
500/500 [==============================] - 1s 2ms/step - loss: 2.1457e-08 - accuracy: 1.0000
Epoch 10/10
500/500 [==============================] - 1s 2ms/step - loss: 1.6482e-08 - accuracy: 1.0000

model.evaluate(x_test, y_test, verbose=2)

333/333 - 1s - loss: 1.3704e-08 - accuracy: 1.0000 - 510ms/epoch - 2ms/step

我手动查看了模型输入数据的随机样本、其输出和关联的标签,但我看不到我的标签编码到输入中,并且输出与我的标签匹配。

i = x_test[10:11]
r = model.predict(x_test[10:11])
l = y_test[10:11]
print(i)
print(np.argmax(r), np.argmax(l))

结果

[[[[101 111 157]
   [101 111 157]
   [116 122 157]
   ...
   [ 82 104  88]
   [ 56  85  81]
   [ 55  79  86]]
  [[101 111 157]
   [101 111 157]
   [116 122 157]
   ...
   [101 131 160]
   [ 99 128 156]
   [ 89 122 149]]]]
12 12

【问题讨论】:

  • 可能只是你的数据是线性可分的
  • @Galletti_Lance 该数据集是 43 种不同类型交通标志的图像(即:停车标志、限速...)这是否可以认为是线性可分的?
  • 您的模型只是多类逻辑回归,因此它收敛的事实意味着它找到了一条完美分离数据的线。这可能是因为数据的性质,但也可能(很可能)是数据量
  • 在这个极简主义级别上,您应该能够查看每个类的最强权重,此时它只是一个矩阵,并弄清楚发生了什么。如果您的数据得到充分体现,则可以保证存在错误,但我们很难在没有问题的情况下调试您的问题。
  • 这是一个错误。构建数据集的方法是复制一个类别的第一张图像,而不是使用整个图像文件夹。 amshrbo 提供的答案让我检查了他的每一个点,当我到达他的第三点时,我注意到一个类别中的所有图像都是相同的。

标签: tensorflow keras


【解决方案1】:

当我得到 100% 的准确率时,我想到了一个过度拟合的问题,但你的模型是如此简单。

在训练中获得 100% 没问题,但在测试集上,我不这么认为。

所以你可能犯了一些可能的错误:

  1. 您可能会将数据泄露到测试集
  2. 您使用的是小型数据集
  3. 您的数据集相似或重复
  4. 检查数据分布,您可能有一个类别拥有大部分数据,而其他类别的数据较少。

作为建议,您可以将另一个指标(例如 precision or recall)添加到您的指标数组中并查看结果。

也可以查看这个类似的post 你可能会得到一些提示

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多