Как сопоставить прогнозируемый класс и допустимость с фактическими метками

#python #tensorflow #deep-learning #predict #one-hot-encoding

#python #тензорный поток #глубокое обучение #прогнозировать #one-hot-encoding

Вопрос:

Я разработал модель глубокого обучения, основанную на двунаправленном LSTM и выводе плотного слоя. Довольно запутанно, что вероятность вывода, полученная с использованием model.predict(x) совпадений с моей фактической меткой (одна горячая закодированная метка). Более того, model.predict_classes(x) выходные данные (0,1,2) также сбивают с толку. Как я могу связать эти выходные данные с моими исходными метками. Ниже приведен мой фрагмент кода для справки:

 model = Sequential()

model.add(Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1]))
model.add(SpatialDropout1D(0.5))


model.add(Bidirectional(tf.keras.layers.LSTM(250, return_sequences=True,activation='tanh')))
model.add(Bidirectional(tf.keras.layers.LSTM(250)))

model.add(Dropout(0.5))



model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
#model.compile(loss='binary_crossentropy', optimizer=Adam(), metrics=['accuracy'])
print(model.summary())

history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10)

model.predict_classes(test_doc)
model.predict(test_doc)

 

Если кто-нибудь, пожалуйста, помогите идентифицировать выходные данные с фактическими метками в этой последовательной модели.

Комментарии:

1. Трудно сказать, не видя никакой обработки, которую вы выполнили для своих меток

2. @NicolasGervais я преобразовал свои метки, т.е. 0,1,2, в однократное горячее кодирование, используя Y = pd.get_dummies(df['Sentiment']).values

Ответ №1:

Предполагая, что вы сделали одно горячее кодирование для своих меток (0, 1, 2), у вас будут векторы в качестве выходных данных вашей модели.

Так, например, если у вас есть экземпляр с классом 0, целевой вектор будет:

 [1, 0, 0]
 

если у вас есть экземпляр с классом 1, ваш целевой вектор будет:

 [0, 1, 0]
 

если у вас есть экземпляр с классом 2, ваш целевой вектор будет:

 [0, 0, 1]
 

Метод .predict даст вам вероятность для каждого класса в вашей цели. Итак, поскольку у вас есть 3 класса (0, 1, 2), вы получите вектор третьего размера с тремя вероятностями

 model.predict(x) # vector of size 3 with 3 probabilities
 

Что-то вроде этого:

 #class0, class1, class2
[0.31,   0.4,    0.29]
 

И эти вероятности будут равны 1, потому что вы использовали функцию активации softmax.

Метод .predict_classes выберет для вас класс с наибольшей вероятностью из вектора и выполнит декодирование

Итак, если у вас есть вектор вероятностей:

 #class0, class1, class2
[0.31,   0.4,    0.29]
 

вы получите 1, потому что максимальное значение в векторе — это значение с индексом 1 в целевом векторе, которое представляет класс 1

PS. Вы можете заставить модель выполнять одно горячее кодирование, изменив потерю как «sparse_categorical_crossentropy»:

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

Без использования pd.get_dummies(df['Sentiment']).value

Комментарии:

1. Спасибо за любезный ответ. Проблема по-прежнему неясна в том, в каком порядке мы должны рассматривать вероятности. Потому что может случиться так, что документ, имеющий метку 1, может появиться первым, а 0 и 2 могут появиться позже.

2. @BilalChandio попробуйте сделать кодировку с помощью ‘sparse_categorical_crossentropy’. Без использования pd.get_dummies(df[‘Sentiment’]).value

3. sparse_categorical_crossentropy подходит, когда количество классов больше. Тем не менее, я тоже пробовал это, но моя сеть требует, чтобы метки были закодированы с одним горячим кодом.

4. разреженная категориальная кроссэнтропия преобразует ваши метки под капотом в один вектор горячего кодирования

5. Вопрос по-прежнему остается без ответа, какая вероятность среди них array([[0.31454232, 0.181991 , 0.50346667]], dtype=float32) представляет какой класс либо 0,1, либо 2