Метрика, которую я хочу реализовать, - это Анализ компонентов соседства, который поясняется ниже:

И моя реализация до сих пор такова:
def NCA2(y_pred, y_true, batch_size):
j_total = []
for i in range (batch_size):
y_pred1 = y_pred[i]
y_true1 = y_true[i]
label1 = tf.argmax(y_true1)
label1 = tf.cast(label1, tf.float32)
y_pred_rest = [y_pred[j] for j in range(batch_size) if j!=i ]
y_pred_rest = tf.stack(y_pred_rest, axis = 0)
y_true_rest = [y_true[j] for j in range(batch_size) if j!= i ]
y_true_rest = tf.stack(y_true_rest, axis = 0)
label_rest = tf.argmax(y_true_rest, axis = 1)
label_rest = tf.cast(label_rest, tf.float32)
mask_sim = [tf.equal(label_rest[j], label1) for j in range(batch_size-1)]
mask_sim = tf.stack(mask_sim, axis = 0)
label3 = tf.cast(mask_sim, tf.float32)
d_all= tf.exp(-tf.reduce_sum(input_tensor=tf.square(tf.subtract(y_pred_rest, y_pred1)), axis = 1))
sum_sim = tf.reduce_sum(tf.multiply(d_all, label3))
sum_diff= tf.reduce_sum(tf.multiply(d_all, label3))
p = tf.divide(sum_sim, sum_diff)
j_total.append(p)
j_total = tf.stack(j_total, axis = 0)
j_total = tf.reduce_sum(j_total)
return j_total
По сути, я перебираю серию примеров (вместо всего обучающего набора), затем для каждого примера я нашел похожие примеры и примеры дистилляторов.и нашли расстояние между указанным примером и двумя наборами похожих и разнородных примеров.И возьмите экспоненту этих расстояний и разделите все похожие расстояния на все разные расстояния.Это не совсем то же самое уравнение.Так вот почему дайте мне Нэн при обучении.
Мой вопрос: хочу ли я сделать то же самое из уравнения выше в кератах, как я могу это сделать.т.е. делим один пример за раз на все другие примеры вместо того, чтобы брать все одинаковые расстояния и определять все разные расстояния.
Возможно ли это?Или есть какая-то лучшая идея для этого показателя.
Большое спасибо заранее.