Путаница с формой ввода для слоя Keras Embedded - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь использовать слой внедрения Keras, чтобы создать собственную реализацию CBoW, чтобы увидеть, как она работает.

Я сгенерировал выходные данные, представленные вектором контекстного слова, которое я ищу с помощьюразмер равен моему словарю.Я также сгенерировал входные данные, чтобы каждое контекстное слово имело X много близлежащих слов, представленных их закодированными векторами в одну горячую строку.

Например, если мое предложение:

пробежал через забор, чтобы найти мою собаку "

используя размер окна 2, я мог бы сгенерировать следующий ввод / вывод:

[[over, the, to, find], fence] где 'fence' - это мое контекстное слово, 'over', '', 'to', 'find' - мои слова рядом с окном 2 (2 впереди, 2 сзади).

Использование примераВокаб размером 500 и 100 обучающих сэмплов, после горячего кодирования моего ввода и вывода, он будет иметь следующие размеры:

y.shape -> (100,500)
X.shape -> (100,4,500)

То есть у меня есть 100 выходов, каждый из которых представлен вектором размером 500,У меня есть 100 входов, каждый из которых представлен серией из 4 500 векторов.

У меня есть простая модель, определенная как:

model = Sequential()
model.add(Embedding(input_dim=vocabulary_size, output_dim=embedding_size, input_length=2*window_size))
#take average of context words at hidden layer
model.add(Lambda(lambda x: K.mean(x, axis = 1), output_shape=(embedding_size,)))
model.add(Dense(vocabulary_size, activation='softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam')

Однако, когда я пытаюсь соответствовать своей модели, яполучите размерное исключение:

model.fit(X, y, batch_size=10, epochs=2, verbose=1)
ValueError: Error when checking input: expected embedding_6_input to have 2 dimensions, but got array with shape (100, 4, 500)

Теперь я могу только предположить, что неправильно использую слой встраивания.Я прочитал и этот CrossValidated Question , и документацию Keras .

Я до сих пор не уверен, как именно работают входы этого слоя внедрения.Я вполне уверен, что мои input_dim и output_dim верны, что оставляет input_length.Согласно CrossValidated, моя input_length - это длина моей последовательности.Согласно Керасу, мои входные данные должны иметь размерность (batch_size, input_length).

Если мои входные данные состоят из 4 слов, каждое из которых представлено вектором слов размером vocab_size, как я могу ввести это в модель?

1 Ответ

0 голосов
/ 28 ноября 2018

Проблема в том, что вы думаете о слое внедрения неправильно.Слой Embedded - это просто обучаемая справочная таблица: вы даете ему целое число , которое является индексом слова в словаре, и он возвращает слово-вектор (т. Е. Вложение слова) данногоиндекс.Следовательно, его входные данные должны быть индексами слов в предложении.

Например, если индексы слов "over", "the", "to" и "find" равны 43, 6, 9 и 33 соответственно, тогда входной сигнал уровня Embedded будет массивом этих индексов, то есть [43, 6, 9, 33].Поэтому данные обучения должны иметь форму (num_samples, num_words_in_a_sentence).В вашем случае это будет (100, 4).Другими словами, вам не нужно однозначно кодировать слова для входных данных.Вы также можете использовать индексы слов в качестве меток, если вместо них вы используете sparse_categorical_crossentropy в качестве функции потерь.

...