我要实现的指标是邻居成分分析,在下面进行了阐明:
到目前为止,我的实现是:
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
基本上,我遍历一批示例(而不是整个训练集),然后为每个示例找到相似的示例和蒸馏器示例,并找到指定的示例与两组相似和不相似的示例之间的距离。然后取这些距离的指数,然后将所有相似的距离除以所有不同的距离。它不是完全相同的方程式。那就是为什么在训练时给我南。
我的问题是,我是否想与keras中的方程式完全相同,我该怎么做。即一次将一个示例除以所有其他示例,而不是采用所有相似的距离并由所有不同的距离决定。
有可能吗?还是对这个指标有更好的主意。
非常感谢。