Я слежу за учебником, который показывает, как создать модель word2vec.
Этот учебник использует этот фрагмент кода:
similarity = merge([target, context], mode='cos', dot_axes=0)
(никакой другой информации не было, но я полагаю, что это происходит от keras.layers
)
Теперь я немного исследовал метод merge
но я не мог найти много о нем. Из того, что я понимаю, он был заменен множеством функций, таких как layers.Add(), layers.Concat()...
Что я должен использовать? Там .Dot()
, который имеет параметр axis
(который кажется правильным), но не параметр mode
.
Что я могу использовать в этом случае?
Есть несколько вещей, которые неясны из документации Keras, которые я считаю крайне важными для понимания:
Для каждой функции в документации keras для Merge
есть прописные и прописные, т.е. add()
и Add()
.
На Github farizrahman4u
выделяет различия:
Merge is a layer.
Merge takes layers as input
Merge is usually used with Sequential models
merge is a function.
merge takes tensors as input.
merge is a wrapper around Merge.
merge is used in Functional API
Using Merge:
left = Sequential()
left.add(...)
left.add(...)
right = Sequential()
right.add(...)
right.add(...)
model = Sequential()
model.add(Merge([left, right]))
model.add(...)
using merge:
a = Input((10,))
b = Dense(10)(a)
c = Dense(10)(a)
d = merge([b, c])
model = Model(a, d)
Чтобы ответить на ваш вопрос, так как Merge
устарела, мы должны сами определить и построить слой для cosine similarity
. В общем случае это будет включать использование тех строчных функций, которые мы заключаем в Lambda
чтобы создать слой, который мы можем использовать в модели.
Я нашел решение здесь:
from keras import backend as K
def cosine_distance(vests):
x, y = vests
x = K.l2_normalize(x, axis=-1)
y = K.l2_normalize(y, axis=-1)
return -K.mean(x * y, axis=-1, keepdims=True)
def cos_dist_output_shape(shapes):
shape1, shape2 = shapes
return (shape1[0],1)
distance = Lambda(cosine_distance, output_shape=cos_dist_output_shape)([processed_a, processed_b]
В зависимости от ваших данных, вы можете удалить нормализацию L2. Что важно отметить в решении, так это то, что оно построено с использованием функции K.mean()
api, например K.mean()
- я думаю, что это необходимо при определении пользовательского слоя или даже функций потерь.
Надеюсь, мне было ясно, это был мой первый ТАК ответ!
Слой Dot
в Keras теперь поддерживает встроенное сходство косинусов, используя параметр normalize = True
.
Из документов Кераса:
keras.layers.Dot(axes, normalize=True)
нормализовать: следует ли L2-нормализовать образцы вдоль оси точечного произведения, прежде чем брать точечное произведение. Если установлено значение "Истина", то выход точечного произведения представляет собой косинусную близость между двумя выборками.
from keras import backend as K