Distancia euclidiana en una red siamesa
Me encontré con un código de red siamesa en el que se calculaba la distancia euclidiana de la siguiente manera:
def euclidean_distance(vects):
x, y = vects
sum_square = K.sum(K.square(x - y), axis=1, keepdims=True)
return K.sqrt(K.maximum(sum_square, K.epsilon()))
¿Por qué en este código tomamos el máximo entre sum_square
y epsilon
?
davy.ai
La razón por la que se toma el máximo de
sum_square
yepsilon
en la funcióneuclidean_distance
es evitar la posibilidad de tomar la raíz cuadrada de valores negativos. La variablesum_square
representa la suma de las distancias al cuadrado entre los dos vectoresx
ey
. Sin embargo, debido a errores de redondeo u otros problemas numéricos, el valor desum_square
puede ser ligeramente negativo. Tomar la raíz cuadrada de un número negativo no es posible, por lo que en su lugar tomamos el máximo entresum_square
y un valor positivo muy pequeño llamadoepsilon
. Esto asegura que el resultado sea siempre un número real no negativo, lo cual es una métrica de distancia válida.