Ошибка при использованииategorical_crossentropy - PullRequest
2 голосов
/ 02 августа 2020

Я изучаю глубокое обучение с помощью tensorflow. Я сделал простой код НЛП, предсказывающий следующее слово в заданном предложении

model = tf.keras.Sequential()
model.add(Embedding(num,64,input_length = max_len-1))   # we subtract 1 coz we cropped the laste word from X in out data
model.add(Bidirectional(LSTM(32)))
model.add(Dense(num,activation = 'softmax'))


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

history = model.fit(X,Y,epochs = 500)

, однако использование category_crossentropy дает мне следующую ошибку:

ValueError: You are passing a target array of shape (453, 1) while using as loss `categorical_crossentropy`. `categorical_crossentropy` expects targets to be binary matrices (1s and 0s) of shape (samples, classes). If your targets are integer classes, you can convert them to the expected format via:
```
from keras.utils import to_categorical
y_binary = to_categorical(y_int)
```

Alternatively, you can use the loss function `sparse_categorical_crossentropy` instead, which does expect integer targets.

Может кто-нибудь объяснить мне, что это означает и почему Я не могу использовать категориальную функцию потерь кроссэнтропии? Спасибо вам большое! Любая помощь будет оценена!

1 Ответ

1 голос
/ 02 августа 2020

Категориальная перекрестная энтропия используется для задач мультиклассовой классификации. Когда вы используете "softmax" в качестве активации, будет один узел для каждого класса в слое вывода . Для каждого образца узел, соответствующий классу образца, должен быть близок к одному , а остальные узлы должны быть близки к нулю . Таким образом, настоящие метки классов Y должны быть вектором кодирования one-hot .

Предположим, ваши метки классов в Y являются целыми числами, например 0,1,2 ,. .. Попробуйте ввести код ниже.

from keras.utils import to_categorical

model = tf.keras.Sequential()
model.add(Embedding(num,64,input_length = max_len-1))   # we subtract 1 coz we cropped the laste word from X in out data
model.add(Bidirectional(LSTM(32)))
model.add(Dense(num,activation = 'softmax'))


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

Y_one_hot=to_categorical(Y) # convert Y into an one-hot vector
history = model.fit(X,Y_one_hot,epochs = 500)  # use Y_one_hot encoding instead of Y
...