Как обучить классификацию НЛП с помощью библиотеки keras?

Вот мои тренировочные данные, я хочу предсказать «y» с помощью X_data, используя библиотеку keras. Я получаю сообщение об ошибке в течение длительного времени, я знаю, что это форма данных, но я застрял на некоторое время. Надеюсь, вы, ребята, могли бы помочь.

X_data =
0     [construction, materials, labour, charges, con...
1     [catering, catering, lunch]
2     [passenger, transport, local, transport, passe...
3     [goods, transport, road, transport, goods, inl...
4     [rental, rental, aircrafts]
5     [supporting, transport, cargo, handling, agenc...
6     [postal, courier, postal, courier, local, deli...
7     [electricity, charges, reimbursement, electric...
8     [facility, management, facility, management, p...
9     [leasing, leasing, aircrafts]
10    [professional, technical, business, selling, s...
11    [telecommunications, broadcasting, information...
12    [support, personnel, search, contract, tempora...
13    [maintenance, repair, installation, maintenanc...
14    [manufacturing, physical, inputs, owned, other...
15    [accommodation, hotel, accommodation, hotel, i...
16    [leasing, rental, leasing, renting, motor, veh...
17    [real, estate, rental, leasing, involving, pro...
18    [rental, transport, vehicles, rental, road, ve...
19    [cleaning, sanitary, pad, vending, machine]
20    [royalty, transfer, use, ip, intellectual, pro...
21    [legal, accounting, legal, accounting, legal, ...
22    [veterinary, clinic, health, care, relation, a...
23    [human, health, social, care, inpatient, medic...
Name: Data, dtype: object

А вот и мой тренировочный предсказатель

y = 

0      1
1      1
2      1
3      1
4      1
5      1
6      1
7      1
8      1
9      1
10     1
11     1
12     1
13     1
14     1
15    10
16     2
17    10
18     2
19     2
20    10
21    10
22    10
23    10

Я использую эту модель:

top_words = 5000
length= len(X_data)
embedding_vecor_length = 32
model = Sequential()
model.add(Embedding(embedding_vecor_length, top_words, input_length=length))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_data, y, epochs=3, batch_size=32)

ValueError: Error when checking input: expected embedding_8_input to have shape (None, 24) but got array with shape (24, 1)

В чем проблема с использованием этих данных в этой модели? Я хочу предсказать «y», используя входные данные X_data?


person user169772    schedule 04.11.2017    source источник


Ответы (1)


Вам нужно преобразовать ваши кадры данных pandas в массивы numpy, массивы будут рваными, поэтому вам нужно их дополнить. Вам также необходимо настроить словарь векторов слов, поскольку вы не можете просто передавать слова непосредственно в нейронную сеть. Некоторые примеры: здесь, здесь и здесь. Вам нужно будет провести собственное исследование здесь. Невозможно много сделать с образцом данных, который вы предоставили.

length = len(X_data) - это количество выборок данных, которые у вас есть, keras не заботится об этом, он хочет знать, сколько слов у вас есть на входе (должно быть одинаковым для каждого, поэтому заполнение было указано ранее)

поэтому ваш вход в сеть - это количество столбцов, которые у вас есть

#assuming you converted X_data correctly to numpy arrays and word vectors
model.add(Embedding(embedding_vecor_length, top_words, input_length=X_data.shape[1]))

Ваши категориальные значения должны быть бинарными.

from keras.utils import to_categorical

y = to_categorical(y)

Ваш последний плотный слой теперь равен 10, при условии, что у вас есть 10 категорий и правильная активация softmax для проблемы с несколькими классами.

model.add(Dense(10, activation='softmax'))

ваш убыток теперь должен быть categorical_crossentropy, так как это мультикласс

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
person DJK    schedule 04.11.2017
comment
У меня это работает! но я не могу ничего предсказать снова, это показывает некоторую ошибку формы. Это очень расстраивает, если честно. Можете ли вы сказать, какие данные потребуются для получения правильного прогноза? - person user169772; 04.11.2017
comment
Я не могу, не зная ошибки или точно того, какую новую настройку вы использовали. Итак, вы говорите, что модель обучается, но когда вы запускаете model.predict(), вы получаете какую-то ошибку? - person DJK; 04.11.2017
comment
Я как бы получил прогноз, выполнив шаг заполнения и кодирования для текста, но вывод кажется странным. Для ввода: jelly = 'плата за обслуживание. консультационные услуги за июнь' я получаю вывод: array([[ 0.48915482], [ 0.48839182], [ 0.49011096], [ 0.48880994], [ 0.4904303 ], [ 0.48839182], [ 0.48839182], .... Этот шаблон подобен для каждого вход около 0,48-0,495 для всех входов, которые я пробовал - person user169772; 04.11.2017
comment
Я лично не верю, что смогу отладить эту проблему в комментариях, так как я уже запутался в выводе, и будет еще 15 или около того комментариев, чтобы действительно понять проблему. Я бы посоветовал вам попробовать отладку (лучше всего мы учимся, немного потрудившись), а затем задать новый вопрос, если его станет слишком много, поскольку это уже становится отдельным вопросом. - person DJK; 05.11.2017