TensorFlow实现center loss

本文介绍如何使用TensorFlow实现Center Loss,这是一种在softmax loss基础上加入正则项的方法,使得同一类别的样本特征向量更加紧密地聚集在一起。文中提供了详细的代码实现与注释。

TensorFlow实现center loss:Center loss是ECCV2016中一篇论文提出来的概念,主要思想就是在softmax loss基础上额外加入一个正则项,让网络中每一类样本的特征向量都能够尽量聚在一起。

具体的原理推导等请参考论文,论文作者放出了Caffe实现,网上还能找到mxnet的实现,这里我放出一个TensorFlow版的实现及详细注释,代码很短,如下:


def get_center_loss(features, labels, alpha, num_classes):
     # alpha:中心的更新比例
     # 获取特征长度
     len_features = features.get_shape()[ 1 ]
     # 建立一个变量,存储每一类的中心,不训练 9
     centers = tf.get_variable( 'centers' , [num_classes, len_features], dtype=tf.float32,
         initializer=tf.constant_initializer( 0 ), trainable=False)
     # 将特征reshape成一维
     labels = tf.reshape(labels, [- 1 ])
 
     # 获取当前batch每个样本对应的中心
     centers_batch = tf.gather(centers, labels)
     # 计算center loss的数值
     loss = tf.nn.l2_loss(features - centers_batch)
 
     # 以下为更新中心的步骤
     diff = centers_batch - features
 
     # 获取一个batch中同一样本出现的次数,这里需要理解论文中的更新公式
     unique_label, unique_idx, unique_count = tf.unique_with_counts(labels)
     appear_times = tf.gather(unique_count, unique_idx)
     appear_times = tf.reshape(appear_times, [- 1 , 1 ])
 
     diff = diff / tf.cast(( 1 + appear_times), tf.float32)
     diff = alpha * diff
     # 更新中心
     centers = tf.scatter_sub(centers, labels, diff)
 
     return loss, centers


http://blog.csdn.net/liyuan123zhouhui/article/details/60139981


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值