Добавление смещения для встраивания слоя в Keras
Я строю модель, используя керасы, чтобы выучить вложения слов, используя скипграмму с отрицательной выборкой. Мой ввод - это пара слов: (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
Я думал об использовании другого плотного слоя (даже не уверен, логично или правильно), чтобы добавить смещение после точечного продукта, но я не мог заставить его работать.
Я действительно хотел бы помочь с добавлением смещения в модель.
1 ответ
Если ты хочешь dimension + 1
ты ищешь concatenate
, не для add
,
Я не знаю размер после dot
(точка странное поведение, смеется), но если это 3D (batch, embedding, embedding)
, вам нужно будет сплющить перед объединением.