Вопрос или проблема
Я новичок в LSTM. Мне нужно объединить словесные и числовые признаки и другие признаки, которые показаны ниже.
Моя задача — классификация предложений
feature_1
= 1) [[16,27,31,42], [0,0,14,21], [0,0,0,72], [0,15,34,31]]
. -> это предложение
[[12,56,12,34], [0,1,22,5], [23,56,2,1], [0,0,0,23]]
-> это предложение
Этот признак — словесный код, т.е. каждое слово связано с целым числом.
Следующий признак — это признак для каждого предложения.
feature_2 указан ниже.
-
->
[1,2,0,0,1,0,3,4]
(для 1-го предложения) -
->
[3,4,2,1,3,4,5,7]
(для 2-го предложения)
У меня есть следующий код, который вызывает ошибку.
mdl_input1 = Input(shape=(max_review_length,)) [max_review_length — это дополненная последовательность, т.е. len(x_train[0]) x_train — это feature_1]
x = LSTM(100, activation='tanh')(mdl_input1)
x = Dropout(0.2)(x)
mdl_input2 = Input(shape=(30,)) #(30 — длина x_train2[0], т.е. длина feature_2[0])
concat = concatenate([x, mdl_input2])
x = Dense(10)(x)
x = Dense(20)(x)
output = Dense(2)(x)
model = Model([mdl_input1, mdl_input2], output)
model.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=['acc'])
model.fit([x_train, x_train2], y_train)
Примечание: – len(x_train[i])
равно len(x_train[j])
для всех i
и j
, так как оно дополнено.
Аналогичный случай с x_train2
, так как это признак, соответствующий каждому предложению.
Ошибка: :- Error when checking input: expected input_5 to have 3 dimensions, but got array with shape (217767, 50)
Но это, как мне кажется, неверно. Я хотел бы узнать Python код для этого. Также код для предсказания модели.
Я нашел пример, который вы можете использовать в документации Keras.
Смотря на этот пример, кажется, что вы используете правильную функцию, поэтому будет полезно, если вы предоставите весь стек ошибок. Трудно сказать, где происходит эта ошибка в коде из того, что вы предоставили.
Ответ или решение
Чтобы соединить функции с использованием LSTM для задачи классификации предложений, необходимо правильно определить входные данные, слои модели и их формы. Давайте разберем вашу задачу шаг за шагом, чтобы устранить возникшие ошибки и успешно построить модель.
Шаг 1: Подготовка данных
У вас есть две функции:
- feature_1 – это последовательности целых чисел, представляющие слова в предложениях, которые необходимо обработать LSTM.
- feature_2 – это числовые признаки, связанные с каждым предложением.
Убедитесь, что ваши данные правильно подготовлены:
- feature_1 должен иметь форму
(количество_предложений, максимальная_длина_предложения, 1)
для работы с LSTM. - feature_2 должен иметь форму
(количество_предложений, количество_признаков)
.
Для этого вы можете использовать np.expand_dims
для добавления размерности, если необходимо.
Шаг 2: Определение модели
Теперь мы можем создать модель, которая будет включать LSTM для обработки feature_1
и полносвязный слой для обработки feature_2
.
import numpy as np
from keras.layers import Input, LSTM, Dropout, Dense, concatenate
from keras.models import Model
# Пример данных для feature_1 и feature_2
x_train_feature_1 = np.array([[[16],[27],[31],[42]], [[12],[56],[12],[34]]]) # Замените на ваши данные
x_train_feature_2 = np.array([[1,2,0,0,1,0,3,4], [3,4,2,1,3,4,5,7]]) # Замените на ваши данные
y_train = np.array([[1,0], [0,1]]) # Это ваши метки, измените на свои
# Установите параметры
max_review_length = x_train_feature_1.shape[1] # длина последовательности
num_features = x_train_feature_2.shape[1] # количество признаков
# Входные слои
mdl_input1 = Input(shape=(max_review_length, 1)) # Добавлено 1 для размерности
mdl_input2 = Input(shape=(num_features,))
# Модель LSTM
x = LSTM(100, activation='tanh')(mdl_input1)
x = Dropout(0.2)(x)
# Объединение
concat = concatenate([x, mdl_input2])
# Полносвязные слои
x = Dense(10, activation='relu')(concat)
x = Dense(20, activation='relu')(x)
output = Dense(2, activation='softmax')(x) # Предполагаемая активация для бинарной классификации
# Создание модели
model = Model(inputs=[mdl_input1, mdl_input2], outputs=output)
# Компиляция модели
model.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=['accuracy'])
# Обучение модели
model.fit([x_train_feature_1, x_train_feature_2], y_train, epochs=10, batch_size=32)
Шаг 3: Прогнозирование
Для прогноза вы также должны убедиться, что входные данные соответствуют тем же формам, что и входные данные во время обучения. Вот пример, как сделать прогноз:
# Пример точки для прогнозирования
x_test_feature_1 = np.array([[[16],[27],[31],[42]]]) # Проверяйте размерность
x_test_feature_2 = np.array([[1,2,0,0,1,0,3,4]]) # Проверяйте размерность
# Прогнозирование
predictions = model.predict([x_test_feature_1, x_test_feature_2])
print(predictions)
Заключение
Обязательно проверьте, что ваши данные имеют правильные формы на всех этапах. Если ошибка продолжает возникать, убедитесь, что вы передаете правильно подготовленные массивы на вход модели. Ваша архитектура модели может быть адаптирована в зависимости от специфики задач и ожидаемых результатов. Надеюсь, это поможет вам успешно использовать LSTM для классификации предложений!