Как получить вероятность каждого класса вместо одного горячо закодированного массива с одним значением 1 и другими 0? - PullRequest
0 голосов
/ 23 сентября 2019

Модель My Sequential CNN обучается в 39 классах в качестве многоклассного классификатора.Что касается предсказаний, он возвращает закодированный массив, например, [0,0,...1,0,...], тогда как я хочу что-то вроде [0.012,0.022,0.067,...,0.997,0.0004,...]

Есть ли способ получить это?если нет, что именно я должен сделать, чтобы получить это?

Причина, по которой я так хочу, состоит в том, чтобы проверить, насколько близки другие классы, поэтому, если один говорит 0,98, а другие говорят 0,96, то я делаю что-то не так, данных недостаточно, и т. Д.

Спасибо:)

Моя модель в основном является keras.model resnet50 со следующими конфигами:

model = keras.applications.resnet.ResNet50(include_top=False, weights=None, input_tensor=None, input_shape=(64,64,1), pooling='avg', classes=39)

x = model.output
x = Dropout(0.7)(x)
num_classes = 39
predictions = Dense(num_classes, activation= 'softmax')(x)
model = Model(inputs = model.input, outputs = predictions)

optimizer = keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer, loss='categorical_crossentropy', metrics=['categorical_accuracy'], loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)

Пример ввода:

import cv2
img = cv2.imread(IMAGE_PATH, 0)
img = cv2.resize(img, (64,64))
img = np.reshape(img, (1,64,64,1))
predicted_class_indices = np.argmax(model.predict(img, verbose = 1))

Пример вывода:

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0.]], dtype=float32)

Желаемый вывод (числа гипотетические):

array([[0.022, 0.353, 0.0535, 0.52, 0212., 0.822, 0.532, 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0.]], dtype=float32)

1 Ответ

0 голосов
/ 23 сентября 2019

Один из способов сделать это - удалить последний слой активации ( связанная проблема ).

Это можно сделать с помощью model.layers[-1].activation=None.

Однакоsoftmax должен выводить не один горячий вектор, а распределение проб, возможно, вы захотите проверить, как проходит ваше обучение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...