Получение вывода массива, но я хочу один вывод с sparse_categorical потерей - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь приспособить простую нейронную сеть керасом. У меня есть вход, и я хотел бы иметь одно целочисленный вывод, который представляет собственный класс. Я хочу, чтобы это было в диапазоне 0-13. Однако, когда последний выход установлен в 1, это дает мне ошибку

InvalidArgumentError: Received a label value of 12 which is outside the valid range of [0, 1).  Label values:

Это то, что у меня есть для составления нейронной сети

import keras
from keras.models import Sequential
from keras.layers import Dense

classifier = Sequential()
classifier.add(Dense(units = 10, kernel_initializer = 'uniform', 
                     activation = 'relu', input_dim = 10))
classifier.add(Dense(units = 11, kernel_initializer = 'uniform', activation = 'relu'))
classifier.add(Dense(units = 8, kernel_initializer = 'uniform', activation = 'relu'))
classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
classifier.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])

classifier.fit(X_train, y_train, batch_size = 2000, epochs = 20)

Мои вводные данные - это массивы, а метки - это просто массив со значениями от 0 до 12

.

Это вывод

enter image description here

Ответы [ 2 ]

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

Давайте разберемся с разреженной категориальной кросс-энтропией

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

так почему ошибка?

в соответствии с тем, что я объяснил, ваша сеть должна иметь возможность прогнозировать 14 классов. так что то, что делается для горячего кодирования, все еще должно быть сделано для сети (не то, что ваше горячее питание было быстрым, это было просто возвращение к этому методу, чтобы напомнить нам, что делать), вам нужно 14 выходных нейронов, чтобы сделать поэтому; последний слой должен выглядеть так:

classifier.add(Dense(units = 14, kernel_initializer = 'uniform', activation = 'sigmoid'))

и, кстати, это хорошая практика использования metrics = ['sparse_categorical_accuracy']

если вы хотите целочисленные выходные данные

есть 2 варианта (насколько мне известно):

y_pred = np.argmax(classifier.predict(X_test), axis=1)

или просто:

y_pred = classifier.predict_classes(X_test)
0 голосов
/ 19 июня 2019

Если вам нужны целочисленные входы в диапазоне [0, 13], это соответствует 14 выходным классам (индексы от 0 до 13, начиная с нуля), поэтому вам необходимо соответствующим образом настроить сеть:

classifier.add(Dense(units = 14, kernel_initializer = 'uniform', activation = 'softmax'))

После обучения, когда модель делает прогноз, вы получите распределение вероятностей по целым числам [0, 13]. Чтобы получить закодированное целое число, вы должны взять индекс с максимальной вероятностью, например:

pred = classifier.predict(some_data)
integer = np.argmax(pred, axis=-1)

В результате будет получена предсказанная целочисленная метка.

...