为什么softmax总是提供1.0的概率?

时间:2018-09-18 15:53:08

标签: machine-learning neural-network keras mnist

我一直在尝试简单的mnist示例。很抱歉,这个问题是否很基本。

from keras.datasets import mnist
from keras.layers import Input, Conv2D, Dense
from keras.models import Sequential
from keras.utils import np_utils

def myModel():

    model= Sequential()
    layer1 = Dense(1024, input_shape=(784,), activation='relu')
    layer2 = Dense(512, activation='relu')
    layer3 = Dense(10, activation='softmax')
    model.add (layer1)
    model.add (layer2)
    model.add(layer3)
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    return model


if __name__ == '__main__':
    print "Inside the main function "
    model = myModel()
    (trainX, trainY), (testX, testY) = mnist.load_data()
    print ("TrainX shape is ", trainX.shape)
    trainX = trainX.reshape(trainX.shape[0], trainX.shape[1] * trainX.shape[2])
    trainY = np_utils.to_categorical(trainY, 10)
    model.fit(trainX, trainY, batch_size=200, epochs=1)

    print ("Let's predict now..")
    print ("Shae of x and shape of 100" , trainX.shape, trainX[10].shape)
    result = model.predict(trainX[100].reshape(1,784 ))
    print result

    import matplotlib.pyplot as plt 
    plt.subplot(2,2,1)
    plt.imshow(trainX[1100].reshape(28,28))
    plt.show()

最后一层的输出值为

[[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]]

我该如何解释这个结果?这不是结果的概率分布吗?如果没有,我怎么能得到相同的?

2 个答案:

答案 0 :(得分:4)

理论上,对于newdf=df[~(df.B.ne(0)&df.A.isna())].copy() newdf.A=newdf.A.fillna(0) newdf Out[566]: B A 0 10 100.0 1 0 0.0 2 20 500.0 3 0 0.0 这样的概率分布,即所有其他[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]的{​​{1}}和p[5]=1,都应该没有什么奇怪的。 ..所有条目都在p[k]=0中,它们总计为k

在实践中,您犯了一个错误,就是不对输入数据进行规范化[0, 1](此处Keras MNIST MLP example应该作为您的指南);添加

1.0

在拟合模型之前,我们得到了(请注意,与您自己的试验相比,拟合期间损耗会变小)

trainX

结果好吗?

trainX = trainX.astype('float32')
trainX /= 255

似乎确实是...

答案 1 :(得分:0)

有两个问题,一个是标题,另一个是身体。对于第一个,是的,softmax总是求和。回忆一下it is defined的方式:

exp(x)/ ∑ exp(x)

由于归一化,其总和为1。在训练开始时,输出应该是随机且大致均匀的,经过良好的训练后,您期望得到与您一样的输出;至少对于清晰的图像。对于其他图像,您可能会得到[0,0.3, 0.7, 0,…],其中一个图像可能会看到两个(或更多)标签。