Активация Keras softmax, потеря category_crossentropy. Но вывод не 0, 1

Я обучил модель CNN только для одной эпохи с очень небольшим количеством данных. Я использую Керас 2.05.

Вот последние 2 слоя модели CNN (частичные), number_outputs = 201. Выходные данные для обучения представляют собой один выход с горячим кодированием 201.

model.add(Dense(200, activation='relu', name='full_2'))
model.add(Dense(40, activation='relu',  name='full_3'))
model.add(Dense(number_outputs, activation='softmax'))

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

Модель сохраняется в файл h5. Затем в сохраненный режим загружается та же модель, что и выше. batch_image — это файл изображения.

prediction = loaded_model.predict(batch_image, batch_size=1)

Я получаю такой прогноз:

ndarray: [[ 0.00498065  0.00497852  0.00498095  0.00496987  0.00497506  0.00496112
   0.00497585  0.00496474  0.00496769  0.0049708   0.00497027  0.00496049
   0.00496767  0.00498348  0.00497927  0.00497842  0.00497095  0.00496493
   0.00498282  0.00497441  0.00497477  0.00498019  0.00497417  0.00497654
   0.00498381  0.00497481  0.00497533  0.00497961  0.00498793  0.00496556
   0.0049665   0.00498809  0.00498689  0.00497886  0.00498933  0.00498056

Вопросы:

  1. Массив предсказания должен быть 1, 0? Почему я получаю вывод, например, вывод активируется как сигмоид, а потеря составляет binary_crossentropy. Что не так? Я хочу еще раз подчеркнуть, что модель не очень хорошо обучена данным. Он почти просто инициализирован со случайными весами.

  2. Если я плохо обучу сеть (еще не сойдусь), например, просто инициализирую веса случайным числом, должен ли прогноз по-прежнему быть 1, 0?

  3. Если я хочу получить вероятность прогноза, а затем решить, как его интерпретировать, как получить вывод прогноза вероятности после обучения CNN?


person user6101147    schedule 24.08.2017    source источник
comment
np.argmax(preds, axis=1) — ваш друг.   -  person user1269942    schedule 07.03.2018


Ответы (4)


Ваш номер вывода равен 201, поэтому ваш вывод будет иметь вид (1,201), а не (1,0). Вы можете легко получить, какой класс имеет наибольшее значение, просто используя np.argmax, и этот класс является выходом для вашего заданного ввода вашей моделью.

И за то, что даже когда вы тренировались только на 1 эпоху, ваша модель научилась чему-то, что может быть очень хромым, но тем не менее она чему-то научилась и на основе этого предсказала результат.

Вы использовали softmax в качестве активации на последнем уровне. Он нормализует ваши выходные данные нелинейным образом, так что сумма выходных данных для всех классов равна 1. Таким образом, значение, которое вы получаете для каждого класса, можно интерпретировать как вероятность того, что этот класс является выходным для данного входного значения. по модели. (Для большей ясности вы можете посмотреть, как работает функция softmax)

И, наконец, каждый класс имеет такие значения, как 0,0049 или подобные, потому что модель не уверена, к какому классу принадлежит ваш ввод. Таким образом, он вычисляет значения для каждого класса, а затем softmax нормализует их. Вот почему ваши выходные значения находятся в диапазоне от 0 до 1.

Например, предположим, что у меня есть четыре класса, поэтому один из вероятных выходных данных может быть похож на [0,223 0,344 0,122 0,311], что в итоге мы рассматриваем как показатель достоверности для каждого класса. И, глядя на показатель достоверности для каждого класса, мы можем сказать, что прогнозируемый класс равен 2, поскольку он имеет самый высокий показатель достоверности 0,344.

person Sargam Modak    schedule 24.08.2017
comment
Спасибо за ваш ответ. На самом деле, я пытаюсь понять, почему значение массива не равно 1 или 0. Например, [0, 0, 1, ..... 0, 0], длина списка = 201 Теперь это похоже на 0,00498809. Я знаю, что общее выходное число равно 201. Но значение не то, что я ожидал. - person user6101147; 24.08.2017
comment
это потому, что модель не уверена, к какому классу принадлежит ваш ввод. Таким образом, он вычисляет значения для каждого класса, а затем softmax нормализует их. Вот почему ваши выходные значения находятся в диапазоне от 0 до 1. Например, скажем, у меня есть четыре класса, поэтому один из вероятных выходных данных может быть похож на [0,223 0,344 0,122 0,311], что в итоге мы рассматриваем как показатель достоверности для каждого класса. . И, глядя на показатель достоверности для каждого класса, мы можем сказать, что прогнозируемый класс равен 2, поскольку он имеет наивысший показатель достоверности 0,344. - person Sargam Modak; 24.08.2017
comment
Я понял! 0,005 (значение элемента массива) * 201 равно примерно 1. Результатом является оценка достоверности, и мне нужно решить, как ее интерпретировать. 0,005 связано с тем, что модель еще не обучена. - person user6101147; 25.08.2017

Выход слоя softmax не равен 0 или 1. На самом деле это нормализованный слой, суммирующийся с 1. Если вы суммируете все свои коэффициенты, они складываются. Чтобы получить прогноз, вы должны получить тот, у которого наибольшее значение. Вы можете интерпретировать их как вероятность, даже если технически их нет. https://en.wikipedia.org/wiki/Softmax_function для определения.

Этот слой используется в процессе обучения, чтобы иметь возможность сравнивать предсказание категориальной классификации и истинной метки.

Это необходимо для оптимизации, потому что оптимизация выполняется на производных функциях (имеющих градиент), а вывод 0,1 не может быть получен (даже непрерывным). Оптимизация выполняется впоследствии для всех этих значений.

Интересным примером является следующий: если ваша истинная цель [0 0 1 0], а результат вашего прогноза [0.1 0.1 0.6 0.2], даже если прогноз правильный, он все равно сможет обучаться, потому что он по-прежнему дает ненулевую вероятность другим классам, на которых вы можете вычислить градиент.

person Nathan    schedule 24.08.2017
comment
Другой вопрос немного отличается от исходного вопроса. Для выборки [0 0 1 0], вывод изображения 1 — [0,1 0,1 0,6 0,2], вывод изображения 2 — [0,25 0,3 0,2 0,25]. Изображение 1 является изображением, «близким» к истинному изображению. Изображение 2 не «близко» к истинному изображению. На самом деле, я хочу, чтобы CNN дал мне такой прогноз, и я знаю, что модель совсем не уверена, я могу отбросить второй прогноз. Возьмем, к примеру, беспилотный автомобиль, изображение 1 — дорога. Изображение 2 - это изображение машины уже на траве, которую я еще не тренировал ездить по траве, машина должна остановиться. Я знаю, что CNN не дает мне хороших результатов. Пожалуйста, прокомментируйте.thx - person user6101147; 25.08.2017

Чтобы получить вывод прогноза в виде класса вместо вероятности, используйте:

model.predict_classes(x_train,batch_size)
person Nguyễn Thu    schedule 15.07.2018

Насколько я понимаю, Softmax говорит о вероятности попадания ценности в этот сегмент из 201 сегмента. С уверенностью в первом ведре вы получите [1,0,0,0,0........]. Поскольку произошло очень мало тренировок/обучения/корректировки веса, все значения 201 составляют около 0,00497, что в сумме дает 1. Достойный описание на developer.Google SoftMax здесь

Результат был указан как «number_outputs», поэтому вы получаете 201 вывод, каждый из которых сообщает вам вероятность (в виде значения от 0 до 1) вашего прогноза как ЭТОГО вывода.

person Tony B    schedule 15.05.2019