如何使用 keras 获得概率值?

数据挖掘 Python 喀拉斯 张量流 美国有线电视新闻网 可能性
2021-10-01 05:57:41

张量流版本='1.12.0'

keras 版本 = '2.1.6-tf'

我正在使用带有 tensorflow 后端的 keras。

我想得到预测的概率值。我希望概率总和为 1。我尝试使用 'softmax' 和 'categorical_crossentropy' 但没有任何效果。

这是我的模型:

X = pickle.load(open("X.pickle", "rb"))
y = pickle.load(open("y.pickle", "rb"))

number_of_gestures = 5 
y = to_categorical(y, num_classes=number_of_gestures) #to_categorical is a function from keras - np_utils.

model = Sequential()
model.add(Conv2D(16, (2,2), input_shape=(IMG_SIZE, IMG_SIZE, 1), activation='relu'))

model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'))

model.add(Conv2D(32, (5,5), activation='relu'))

model.add(MaxPooling2D(pool_size=(5, 5), strides=(5, 5), padding='same'))

model.add(Conv2D(64, (5,5), activation='relu'))

model.add(Flatten())

model.add(Dense(128, activation='relu'))

model.add(Dropout(0.2))

model.add(Dense(number_of_gestures, activation='softmax'))

sgd = optimizers.SGD(lr=1e-2)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
model.fit(X, y, batch_size=500, epochs=40, validation_split=0.1)

概率如下所示:

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

我希望它看起来像这样:

[0.897。0.023。0.158。0.780。0.1021]

我知道它不等于 1,但这只是一个例子。

3个回答

我在 Keras 中使用 CNN 时遇到了这样的问题。甚至,我认为输出正在以像argmax().

  • 但是,在研究了模型之后,我发现模型的学习和泛化非常好,以至于标签被二值化(0s 和 1s)。请记住,我们将图像的标签作为一个热向量(如 [1 0 0 0])。NN 学得很好,以至于输出(通常是概率向量)现在是训练它的一个热门向量。

  • 另一种证明这一点的方法是您在输出层使用了 softmax 激活函数。softmax 函数产生的概率总和为 1。所有类概率的总和为 1。在向量 [1 0 0 0 0] 中。所有数字的总和为 1。因此输出有效。

这只是训练模型的不同阶段。您可以尝试增加数据集的大小或将学习率降低到 0.0001 甚至更小。

我的猜测是,predict当您需要调用时,您正在调用predict_proba

正如我在 stackoverflow 上发现的对我有用的类似内容,这里是链接 [StackOverflow Link][1]。我引用的“

我想我发现了错误。您正在使用 ImageDataGenerator 重新调整您的训练和测试数据。但是在测试单个图像时,您并没有这样做。试试这个:

    #Making new Predictions
    import numpy as np
    from keras.preprocessing import image
    
    test_image_luna=image.load_img('dataset/single/SkilletLuna.JPG',target_size=(64,64))
    test_image2=image.img_to_array(test_image_luna)/255 #add this one
    test_image2=np.expand_dims(test_image2,axis=0)
    luna=classifier.predict_proba(test_image2)


  [1]: https://stackoverflow.com/questions/54513742/how-do-i-get-probability-confidence-as-output-for-a-cnn-using-keras-in-python