我只是在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)
你可以参考这个链接,了解更多关于绘制预测图像的预测百分比。