Softmax不给出每一类的概率



我只是在Fashion MNIST数据集上做一个简单的DNN,我把最后一层设置为10个单位,并使用softmax激活。我期望看到的是每一类可能出现的概率但我得到的都是1,就像它是一个二元分类器一样。不知道我做错了什么!

import tensorflow as tf
from tensorflow import keras
import numpy as np
#Loading data and setting the training, validation and test samples
fashion_mnist = keras.datasets.fashion_mnist
(X_train_full, y_train_full),(X_test,y_test) = fashion_mnist.load_data()
X_valid, X_train = X_train_full[:5000]/255. , X_train_full[5000:]/255.
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]

#Creating the model
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28,28]),
keras.layers.Dense(300, activation = 'relu'),
keras.layers.Dense(100, activation = 'relu'),
keras.layers.Dense(10, activation = 'softmax'),
])
model.compile(loss="sparse_categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
history = model.fit(X_train, y_train, epochs=30, validation_data=(X_valid, y_valid))
# Predicting values
X_new = X_test[:3]
y_proba = model.predict(X_new)
y_proba.round(2)

这是我期望看到一些类的百分比(小数),但我得到所有的15…我查看了所有1000个测试样本,但为了简单起见,我只显示前3个:

array([[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]], dtype=float32)

我没有得到什么?还是做错了?

尝试用X_valid检查预测,因为您已经通过将数据集子集为(X_train, y_train)(X_valid, y_valid)来训练模型:

# Predicting values
X_new = X_valid[:3]
y_proba = model.predict(X_new)
y_proba

输出:

array([[8.7486797e-15, 4.1651571e-14, 1.4356388e-15, 2.7562514e-19,
6.6444322e-15, 2.3569682e-10, 8.2472345e-15, 3.0666047e-03,
4.6038006e-14, 9.9693334e-01],
[9.9992633e-01, 1.2232946e-16, 2.8763867e-05, 6.6998540e-10,
3.3127880e-09, 4.4620761e-18, 4.4978275e-05, 7.2699694e-15,
9.3659594e-12, 3.5588103e-24],
[9.8151851e-01, 1.6080153e-04, 7.4726825e-07, 1.8097689e-02,
1.4498403e-08, 1.7963254e-10, 2.2226702e-04, 2.8377571e-15,
4.3501883e-13, 4.1252978e-12]], dtype=float32)

四舍五入后:

y_proba.round(2)

输出:

array([[0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 1.  ],
[1.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],
[0.98, 0.  , 0.  , 0.02, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ]],
dtype=float32)

检查X_valid前3个值的预测:

for y in y_proba:
print(np.argmax(y))

输出:

9
0
0

如果您想将这些值与y_valid(实际标签)进行比较:

y_valid[:3]

输出:

array([9, 0, 0], dtype=uint8)

你可以参考这个链接,了解更多关于绘制预测图像的预测百分比。

最新更新