Мы реализуем центральные потери, поэтому у нас есть две формулы для реализации, такие как:
Положительная разность всех центров с:
, который реализован следующим образом:
num_features = embedding.get_shape()[1]
centroids = tf.get_variable('c',shape=[num_classes,num_features],
dtype=tf.float32,initializer=tf.contrib.layers.xavier_initializer(),trainable=False)
centroids_delta = tf.get_variable('centroidsUpdateTempVariable',shape=[num_classes,num_features],dtype=tf.float32,
initializer=tf.zeros_initializer(),trainable=False)
centroids_batch = tf.gather(centroids,labels)
cLoss = tf.nn.l2_loss(embedding - centroids_batch) / float(batch_size) # Eq. 2
diff = centroids_batch - embedding
delta_c_nominator = tf.scatter_add(centroids_delta, labels, diff)
indices = tf.expand_dims(labels,-1)
updates = tf.constant(value=1,shape=[indices.get_shape()[0]],dtype=tf.float32)
shape = tf.constant([num_classes])
labels_sum = tf.expand_dims(tf.scatter_nd(indices, updates, shape),-1)
centroids = centroids.assign_sub(ALPHA * delta_c_nominator / (1.0 + labels_sum))
centroids_delta = centroids_delta.assign(tf.zeros([num_classes,num_features]))
, а теперь мне нужно найти отрицательную разницу с минимальными значениями следующим образом:
где qi:
Я не нашел ни одной совместимой функции Tensorflow, которая могла бы добиться того же.