Вычисление косинусного сходства между двумя тензорами в Керасе

1

Я слежу за учебником, который показывает, как создать модель word2vec.

Этот учебник использует этот фрагмент кода:

similarity = merge([target, context], mode='cos', dot_axes=0) (никакой другой информации не было, но я полагаю, что это происходит от keras.layers)

Теперь я немного исследовал метод merge но я не мог найти много о нем. Из того, что я понимаю, он был заменен множеством функций, таких как layers.Add(), layers.Concat()...

Что я должен использовать? Там .Dot(), который имеет параметр axis (который кажется правильным), но не параметр mode.

Что я могу использовать в этом случае?

Теги:
keras

2 ответа

6
Лучший ответ

Есть несколько вещей, которые неясны из документации 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() - я думаю, что это необходимо при определении пользовательского слоя или даже функций потерь.

Надеюсь, мне было ясно, это был мой первый ТАК ответ!

  • 2
    Спасибо! Я добавлю для всех будущих посетителей, которые вам нужно from keras import backend as K
6

Слой Dot в Keras теперь поддерживает встроенное сходство косинусов, используя параметр normalize = True.

Из документов Кераса:

keras.layers.Dot(axes, normalize=True)

нормализовать: следует ли L2-нормализовать образцы вдоль оси точечного произведения, прежде чем брать точечное произведение. Если установлено значение "Истина", то выход точечного произведения представляет собой косинусную близость между двумя выборками.

Источник

Ещё вопросы

Сообщество Overcoder
Наверх
Меню