Я пытался с простым примером 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.]]

Как мне интерпретировать этот результат? Разве это не распределение вероятностей для результата? если нет, как я могу получить то же самое?

1
Whoami 18 Сен 2018 в 18:53

2 ответа

Лучший ответ

Теоретически не должно быть ничего странного в распределении вероятностей вроде [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.], т.е. p[5]=1 и p[k]=0 для всех остальных k ... Все записи находятся в [0, 1] и в сумме составляют 1.0.

На практике вы делаете ошибку, не нормализуя входные данные trainX (Пример Keras MNIST MLP должен быть вашим руководством здесь); добавление

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

Вроде действительно ...

4
desertnaut 18 Сен 2018 в 19:53

Есть два вопроса: один в заголовке, другой в теле. Для первого да, softmax всегда в сумме дает единицу. Вспомните, как определяется:

Exp (x) / ∑ exp (x)

Который всегда суммируется с одним из-за нормализации. В начале обучения выходные данные должны быть случайными и приблизительно одинаковыми, а после хорошей тренировки вы ожидаете такой же результат; По крайней мере, для четких изображений. Для других изображений вы можете получить [0,0.3, 0.7, 0,…], где для изображения видны две (или более) метки.

0
Huang_d 18 Сен 2018 в 16:38