#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