Классификация текста (мешок слов) с использованием неправильных предсказаний Keras && модель создания несуществующих классов

1

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

Набор учебных данных содержит около 1,3 миллиона записей с описаниями предметов и связанными с ними отделами. Есть 54 отдела, которые являются моим числом классов.

вопрос

test_dataset = ['white puppy','cottonelle clean  mega','zagg universal keyboard','sweet milk tea'']

Проблема заключается во время предсказания вышеупомянутого массива, который имеет точно такие же элементы, как и мой набор учебных материалов. Они либо попадают в неправильные ведра, либо создается совершенно новый класс, который не существует в моем наборе данных. Мой диапазон классов находится между (min 1 и max 98), но в общей сложности 54 класса.

Например: сладкий молочный чай должен идти до 1, но идет до 2 хлоролевых чистых мега должен идти до 3, но идет до 45, который даже не существует.

Вот мои входные наборы данных: text_train text_test label_train label_test

параметры

vocab_size = 130000
longest_string = 20
hidden_size = 128
num_classes = 54
batch_size = 25000
epochs =7

Преобразование данных ярлыков в однонаправленные векторы:

labelencoder_Y = LabelEncoder()
x = labelencoder_Y.fit_transform(label_train)
label_cat_train = np_utils.to_categorical(x, num_classes= num_classes)
y = labelencoder_Y.fit_transform(label_test)
label_cat_test = np_utils.to_categorical(y, num_classes= num_classes)

Преобразование моих текстовых данных в числовые массивы и заполнение

tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(text_train)
sequences = tokenizer.texts_to_sequences(text_train)
padded_sequences = pad_sequences(sequences)
data = pad_sequences(sequences, maxlen=longest_string)

Построение модели и подготовка данных

model = Sequential()
model.add(Embedding(vocab_size, hidden_size,input_length=longest_string))
model.add(GRU(256, dropout=0.25, return_sequences=True))
model.add(GRU(256, dropout=0.25))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(data, label_cat_train, validation_split=0.1, epochs=epochs,batch_size = batch_size) 

Кроме того, производительность выходной модели также довольно высока. Это не имеет смысла.

2018-09-18 22:05:41.039445: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
1101365/1101365 [==============================] - 668s 606us/step - loss: 3.4749 - acc: 0.1313 - val_loss: 2.6991 - val_acc: 0.2888
Epoch 2/7
1101365/1101365 [==============================] - 673s 611us/step - loss: 2.0425 - acc: 0.4523 - val_loss: 1.3667 - val_acc: 0.6435
Epoch 3/7
1101365/1101365 [==============================] - 682s 620us/step - loss: 1.0634 - acc: 0.7231 - val_loss: 0.8052 - val_acc: 0.7945
Epoch 4/7
1101365/1101365 [==============================] - 679s 617us/step - loss: 0.6992 - acc: 0.8187 - val_loss: 0.6251 - val_acc: 0.8392
Epoch 5/7
1101365/1101365 [==============================] - 679s 617us/step - loss: 0.5478 - acc: 0.8562 - val_loss: 0.5329 - val_acc: 0.8616
Epoch 6/7
1101365/1101365 [==============================] - 677s 615us/step - loss: 0.4618 - acc: 0.8770 - val_loss: 0.4814 - val_acc: 0.8739
Epoch 7/7
1101365/1101365 [==============================] - 690s 626us/step - loss: 0.4064 - acc: 0.8903 - val_loss: 0.4411 - val_acc: 0.8840

Чрезвычайно признателен, если кто-то может внести вклад в эту ситуацию.

Теги:
keras
text
classification

1 ответ

0
Лучший ответ

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

labelencoder_Y = LabelEncoder()
x = labelencoder_Y.fit_transform(label_train)
label_cat_train = np_utils.to_categorical(x, num_classes=num_classes)
y = labelencoder_Y.transform(label_test)  # do not fit again, but reuse the encoder
label_cat_test = np_utils.to_categorical(y, num_classes=num_classes)

Возможно, вам также нужно проверить метки своей категории. Вы пишете, что

мега должна идти до 3, но идет до 45, которая даже не существует

но укажите, что

num_classes = 54

который также является размером вашего выходного слоя.

  • 0
    'Test_dataset' не подвергается никакому преобразованию кодером. На самом деле это то, как он трансформируется с помощью токенизатора. sequences = tokenizer.texts_to_sequences(test_dataset) padded_sequences = pad_sequences(sequences) test_data = pad_sequences(sequences, maxlen=longest_string) Я обновил информацию о классах в OP.
  • 0
    Пожалуйста, внимательно посмотрите на код, который я разместил. Вы используете labelencoder_Y для кодирования меток теста (как и должно быть), но в своей версии вы эффективно создаете новый кодировщик для меток теста, что может привести к тому, что другой числовой метке будет присвоен класс.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню