代码之家  ›  专栏  ›  技术社区  ›  Whoami

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

  •  0
  • Whoami  · 技术社区  · 6 年前

    我一直在尝试简单的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 回复  |  直到 6 年前
        1
  •  4
  •   desertnaut SKZI    6 年前

    理论上 概率分布应该没有什么奇怪的 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.] ,即 p[5]=1 p[k]=0 对于所有其他 k …所有条目都在 [0, 1] 它们的总和是 1.0 .

    在实践中 ,您犯了不规范输入数据的错误。 trainX (the Keras MNIST MLP example 这里应该是你的向导);补充

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

    在拟合模型之前,我们得到(注意 损失 将在试衣过程中进行,与您自己的试衣相比):

    result = model.predict(trainX[100].reshape(1,784 ))
    # result:
    array([[6.99907425e-04, 7.85773620e-04, 1.73144764e-03, 9.31426825e-04,
            5.75593032e-04, 9.49266493e-01, 1.22108115e-02, 1.03891856e-04,
            3.18745896e-02, 1.82012399e-03]], dtype=float32)
    

    结果好吗?

    np.argmax(result)
    # 5
    
    np.argmax(trainY[100])  # true label
    # 5
    

    似乎真的…

        2
  •  0
  •   Huang_d    6 年前

    有两个问题,一个是你的题目,一个是身体。对于第一个,是的,SoftMax总是等于一。回忆如何 it is defined :

    经验(x)/经验(x)

    由于归一化的原因,总有一个结果。在培训开始时,输出应该是随机的、大致一致的,并且在经过良好的培训之后,您希望得到与您相同的输出;至少对于清晰的图像而言。对于其他图像,您可以 [0,0.3, 0.7, 0,…] 其中一个图像可以看到两个(或多个)标签。