Как получить вероятности классификации в Керасе? - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь получить вероятности классификации из моей обученной модели Keras, но когда я использую метод model.predict (или model.predict_proba), все, что я получаю, это массив этой формы: массив ([[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]], dtype = float32)

Так что в основном я получаю массив с плавающей запятой. «1» находится в основном в правильном месте, поэтому обучение, кажется, работало нормально. Но почему я не могу вывести вероятности? См. Код для используемой архитектуры.

Сначала я прочитал данные:

mnist_train = pd.read_csv('data/mnist_train.csv')
mnist_test = pd.read_csv('data/mnist_test.csv')

mnist_train_images = mnist_train.iloc[:, 1:].values
mnist_train_labels = mnist_train.iloc[:, :1].values
mnist_test_images = mnist_test.iloc[:, 1:].values
mnist_test_labels = mnist_test.iloc[:, :1].values

mnist_train_images = mnist_train_images.astype('float32')
mnist_test_images = mnist_test_images.astype('float32')
mnist_train_images /= 255   
mnist_test_images /= 255

mnist_train_labels = keras.utils.to_categorical(mnist_train_labels, 10)
mnist_test_labels = keras.utils.to_categorical(mnist_test_labels, 10)

mnist_train_images = mnist_train_images.reshape(60000,28,28,1)
mnist_test_images = mnist_test_images.reshape(10000,28,28,1)

Затем я строю свою модель и тренируюсь:

num_classes = mnist_test_labels.shape[1] 

model = Sequential()

model.add(Conv2D(64, (5, 5), input_shape=(28, 28, 1), activation='relu', data_format="channels_last", padding="same"))
model.add(Conv2D(64, (5, 5), input_shape=(28, 28, 1), activation='relu', data_format="channels_last", padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3), activation='relu', data_format="channels_last", padding="same"))
model.add(Conv2D(128, (3, 3), activation='relu', data_format="channels_last", padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Dropout(0.2))

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

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(mnist_train_images, mnist_train_labels, validation_data=(mnist_test_images, mnist_test_labels), epochs=20, batch_size=256, verbose=2)

scores = model.evaluate(mnist_test_images, mnist_test_labels, verbose=0)

print("CNN Error: %.2f%%" % (100-scores[1]*100))

model.save('mnist-weights.model')
model.save_weights("mnist-model.h5")
model_json = model.to_json()
with open("mnist-model.json", "w") as json_file:
    json_file.write(model_json)

Но когда я затем загружаю модель в другое приложение и пытаюсь предсказать вероятности, подобные этой, возникает описанная ошибка. Что я делаю не так?

json_file = open('alphabet_keras/mnist_model.json', 'r')
model_json = json_file.read()
model = model_from_json(model_json)
model.load_weights("alphabet_keras/mnist_model.h5")

letter = cv2.cvtColor(someImg, cv2.COLOR_BGR2GRAY)
letter = fitSquare(letter,28,2) # proprietary function, doesn't matter
letter_expanded = np.expand_dims(letter, axis=0)
letter_expanded = np.expand_dims(letter_expanded, axis=3)
model.predict_proba(letter_expanded)#[0]

Вывод следующий: массив ([[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]], dtype = float32)

Я ожидаю что-то вроде: массив ([[0,1, 0,34, 0,2, 0,8, 0,1, 0,62, 0,67, 1,0, 0,31, 0,59]], dtype = float32)

Нет сообщений об ошибках любого вида. Пожалуйста, помогите:)

1 Ответ

1 голос
/ 11 июня 2019

Ваш ожидаемый результат является неправильным, для классификации выход нейронной сети представляет собой распределение вероятностей по меткам, что означает, что вероятности находятся в диапазоне от 0 до 1, и что они составляют в сумме 1,0. Значения, которые вы показываете, составляют более 1,0.

По поводу вашей конкретной проблемы, похоже, что вероятности насыщены, это связано с тем, что вы не нормализуете значения пикселей путем деления на 255, что вы делаете с обучающими и тестовыми наборами, это несоответствие насытит Выходные нейроны.

...