@nasdi

Embedding Keras?

Пытаюсь соединить keras и word2vec. После get_keras_embedding не понимаю что подавать сети для обучения. Слова, векторы, токены слов, изначальные предложения не работают.
Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 4457 arrays:
Не понимаю почему ожидается такая размерность массива.
Всего около 5500 предложений и vocab word2vec около 8000
text = []
for i in df['Message']:
    text.append(i.split())
model = Word2Vec(text, size=300, window=3, min_count=3, workers=16)
kmodel = Sequential()
kmodel.add(model.wv.get_keras_embedding(train_embeddings=False))
kmodel.add(Dropout(0.2))

kmodel.add(Conv1D(50,
                 3,
                 padding='valid',
                 activation='relu',
                 strides=1))
kmodel.add(GlobalMaxPooling1D())

kmodel.add(Dense(250))
kmodel.add(Dropout(0.2))
kmodel.add(Activation('relu'))

kmodel.add(Dense(1))
kmodel.add(Activation('sigmoid'))

kmodel.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
kmodel.fit(x_train, y_train,
          batch_size=32,
          epochs=5,
          validation_data=(x_test, y_test))
  • Вопрос задан
  • 694 просмотра
Решения вопроса 1
@nasdi Автор вопроса
Разобрался, оставляю решение.
1) Токен = количество слов, с запасом брать нельзя!!!
token = Tokenizer(7229)
token.fit_on_texts(df.Message)
text = token.texts_to_sequences(df.Message)

2) стандартно для кeras дополняем предложения 0
text = sequence.pad_sequences(text, maxlen=75)
3)создаем мешок слов по первоначальным предложениям и даем word2vec
mes = []
for i in df['Message']:
    mes.append(i.split())
model = Word2Vec(mes, size=300, window=3, min_count=1, workers=16)

4) В качестве подаваемых данных сети даем токенизированные предложения дополненные 0. Конвертим в np.array
x_train, x_test, y_train, y_test = train_test_split(text, y, test_size=0.2, stratify=y)

5)Создаем слой embedding из gensim при помощи wv.get_keras_embedding.
kmodel = Sequential()
kmodel.add(model.wv.get_keras_embedding(train_embeddings=True))
kmodel.add(Dropout(0.2))

kmodel.add(Conv1D(50,
                 3,
                 padding='valid',
                 activation='relu',
                 strides=1))
kmodel.add(GlobalMaxPooling1D())

kmodel.add(Dense(250))
kmodel.add(Dropout(0.2))
kmodel.add(Activation('relu'))

kmodel.add(Dense(1))
kmodel.add(Activation('sigmoid'))

kmodel.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
kmodel.fit(x_train, y_train,
          batch_size=32,
          epochs=5,
          validation_data=(x_test, y_test)

train_embeddings=True
Заметно увеличивает точность, как и время обучения.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы