Евклидово расстояние в Керасе - PullRequest
0 голосов
/ 09 января 2020

Я наткнулся на некоторый код Keras в сиамской сети, где два ndarrays каждого размера (?, 128) передаются в слой, чтобы получить разницу между ними, а затем в слой Lambda, чтобы получить квадрат квадратов суммы Полученный массив, цель этого состоит в том, чтобы получить евклидово расстояние между двумя начальными массивами

embedded_distance = layers.Subtract(name='subtract_embeddings')([encoded_1, encoded_2])

embedded_distance = layers.Lambda(lambda x: K.sqrt(K.sum(K.square(x), axis=-1, keepdims=True)), name='euclidean_distance')(embedded_distance)

, что смущает то, что В визуальной архитектуре модели выходной размер этого слоя, а также входной размер следующего плотного слоя также имеет размер (?, 128), разве это не должно быть просто числом? Или как работает метод sum?

Вот ссылка на класс, если кому-то это интересно, а также визуальная архитектура. (примечание: этот код не изменен мной, и он работает, поскольку я обучил модель с ним)

http://codebin.herokuapp.com/?s=5e162c612cdd6f0004000001

https://imgur.com/a/zC7Uyfm

1 Ответ

0 голосов
/ 09 января 2020

Проблема, о которой вы сообщаете, связана с тем, что вы используете

distance_metric == 'weighted_l1'

Вам следует изменить эту строку кода

embedded_distance = layers.Lambda(lambda x: K.abs(x))(embedded_distance)

На

embedded_distance = layers.Lambda(
        lambda x: K.sum(K.abs(x), axis=-1, keepdims=True), 
        name='euclidean_distance')(embedded_distance)

Обратите также внимание, что добавление output = layers.Dense(1, activation='sigmoid')(embedded_distance) не представляет интереса, поскольку вход в слой shi в этом случае уже является скаляром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...