keras 为什么我的模型仅用一层softmax就能给予100%的准确性?

mm9b1k5b  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(71)

我的任务是学习如何创建一个可以对图像进行分类的模型。在创建一个模型后,我获得了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

eni9jsuy

eni9jsuy1#

当我得到100%的准确率时,我想到了一个过度拟合的问题,但是你的模型太简单了。
在训练中得到100%的成绩是可以的,但在测试集上,我不这么认为。
你可能犯的一些错误:
1.您可能会将数据泄露给测试集
1.您正在使用小型数据集
1.您的数据集相似或存在重复数据集
1.检查数据分布,你可能有一个类别拥有大部分数据,而其他类别只有少量数据。
作为一个建议,你可以添加另一个指标,如precision or recall到你的指标数组,并查看结果。
也检查这个类似的post你可能会得到一些提示

iyfamqjs

iyfamqjs2#

如果您过去经常复制数据以增加数据量(即,您的数据由重复的相同数据组成),就会出现此问题。
数据的简单性也可能是一个问题(但获得100%准确率的概率很低)。
祝你好运。

相关问题