Несоответствие формы ввода плотной функции с одним горячим закодированным обучением в кератах - PullRequest
0 голосов
/ 12 июня 2018

Целевой выходной обучающий набор выглядит следующим образом: y_train = [0, 5, 3, 1]

Одно горячее закодированное значение выглядит следующим образом:

Y_train = [[1. 0. 0. 0. 0. 0.]

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

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

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

Числоколичество классов в этом целевом наборе равно 4. Размер отдельного значения, закодированного в горячем виде, равен 6.

Когда я упоминаю число значений класса в конечной плотной функции выходных данных последовательной модели keras, я получаю следующее сообщение об ошибке:

*ValueError: Error when checking target: expected dense_2 to have shape (None, 4) but got array with shape (44833, 6)*

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

old_y_train = [0, 5, 3, 1]

new_y_train = [0, 3, 2, 1]

С этой модификацией модель dl работает как число классов, совпадающих с измерением одного горячо закодированного значения.

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

У меня такое чувство, что ты не понимаешь одноразовое кодирование.Одно горячее кодирование преобразует класс (2) в 1 и 0, это то же самое, что вы получили, однако ваш горячий массив неверен.

  Y_train = [[1. 0. 0. 0. 0. 0.]

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

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

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

то, как вы его написали, означает, что у него 6 классов,и 4 точки данных, или 4 примера.То, что вы хотите, это: у вас такое чувство, что вы не понимаете одно горячее кодирование.Одно горячее кодирование преобразует класс (2) в 1 и 0, это то же самое, что вы получили, однако ваш горячий массив неверен.

Y_train = [[1. 0. 0. 0.]

           [0. 0. 0. 1.]

           [0. 1. 0. 0.]

           [0. 1. 0. 0. ]]

Теперь у вас есть 4 класса, и это ваша ошибкажалуется на.

0 голосов
/ 12 июня 2018

Количество единиц в последнем слое должно соответствовать количеству классов, а количество классов должно соответствовать длине одного горячего кодирования y_train.Поэтому, если у вас есть следующие данные для y_train

Y_train = [[1. 0. 0. 0. 0. 0.]

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

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

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

, тогда последний слой модели должен выглядеть следующим образом:

model.add(Dense(6,activation="softmax"))

Я думаю, что это решит вашу проблему.

...