Добавление смещения для встраивания слоя в Keras - PullRequest
0 голосов
/ 10 февраля 2019

Я строю модель, используя керасы, чтобы выучить вложения слов, используя скипграмму с отрицательной выборкой.Мой ввод - это пара слов: (context_word, target_word) и, конечно, метка 1 для позитивов и 0 для негативных пар.Что мне нужно сделать, это добавить смещение к модели.Смещение должно быть только смещением целевого слова для каждого ввода, а не для обоих слов.

До сих пор у меня есть код:

input_u = Input((1,))
input_v = Input((1,))

item_embedding = Embedding(input_dim = items_size, 
                           output_dim = embed_dim,                           
                           name = 'item_embedding')

bias_embedding = Embedding(input_dim = items_size, 
                           output_dim = 1, 
                           embeddings_initializer = 'zeros', 
                           name = 'bias_embedding')

u = item_embedding(input_u)
v = item_embedding(input_v)
b_v = bias_embedding(input_v)

dot_p_layer = merge.dot([u, v], axes = 1)
with_bias = merge.add([dot_p_layer, b_v])
flattenned = Flatten()(with_bias)

output_layer = Dense(1, 
                     activation = 'sigmoid', 
                     use_bias = False)(flattenned)
print (output_layer.shape)

model = Model(inputs=[input_u, input_v], outputs=output_layer)
model.compile(loss='binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

Однако я не могу заставить его работать.Код работает , но Я получаю более высокие потери и более низкую точность, чем модель без смещения.Так что я думаю, что я делаю что-то не так.Кроме того, когда я проверяю размеры, я все равно получаю размер моего врезного размера, а не встраивание измерение + 1

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

Мне очень нужна помощь в добавлении смещения в модель.

1 Ответ

0 голосов
/ 10 февраля 2019

Если вы хотите dimension + 1, вы ищете concatenate, а не add.

Я не знаю размер после dot (точка - странное поведение, смеется), но если это 3D (batch, embedding, embedding), вам нужно сгладить перед объединением.

...