Я пытаюсь использовать слой внедрения 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
, как я могу ввести это в модель?