版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接和本声明。
本文连接:https://blog.csdn.net/limiyudianzi/article/details/80697711
我主要分三篇文章给你们介绍tensorflow的损失函数,本篇为tensorflow自定义损失函数。
(一)tensorflow内置的四个损失函数
(二)其余损失函数
(三)自定义损失函数
自定义损失函数是损失函数章节的结尾,学习自定义损失函数,对于提升分类分割等问题的准确率颇有帮助,同时探索新型的损失函数也可让你文章多多。这里咱们介绍构建自定义损失函数的方法,而且介绍能够均衡正负例的loss,以及在多分类中能够解决样本数量不均衡的loss的方法。
首先为了有足够的知识学会自定义损失函数,咱们须要知道tensorflow都能实现什么样的操做。其实答案是你常见的数学运算均可以,因此说只要你能把心中的损失函数表达为数学式的形式,那么你就可以将其转变为损失函数的形式。下面介绍一些常见的函数:
四则运算:tf.add(Tensor1,Tensor2),tf.sub(Tensor1,Tensor2), tf.mul(Tensor1,Tensor2),tf.div(Tensor1,Tensor2)这里的操做也能够被正常的加减乘除的负号所取代。这里想要指出的是乘法和除法的规则和numpy库是同样的,是matlab中的点乘而不是矩阵的乘法,矩阵的乘法是tf.matmul(Tensor1, Tensor2)
基础运算: 取模运算(tf.mod()),绝对值(tf.abs()),平方(tf.square()),四舍五入取整(tf.round()),取平方根(tf.sqrt()) ,天然对数的幂(tf.exp()) ,取对数(tf.log()) ,幂(tf.pow()) ,正弦运算(tf.sin())。以上的这些数学运算以及不少没有被说起的运算在tensorflow中均可以本身被求导,因此你们不用担忧还须要本身写反向传播的问题,只要你的操做是由tensorflow封装的基础操做实现的,那么反向传播就能够自动的实现。
条件判断,经过条件判断语句咱们就能够实现分段的损失函数,利用tf.where(condition, tensor_x, tensor_y) 若是说条件condition是True那么就会返回tensor_x,若是是False则返回tensor_y。注:旧版本的tensorflow能够用tf.select实现这个操做。
比较操做,为了得到condition这个参数,咱们能够用tf.greater( tensor_x, tensor_y)若是说tensor_x大于tensor_y则返回True。
tf.reduce_sum(),tf.reduce_mean()这两个操做是重要的loss操做,由于loss是一个数字,而一般计算获得的是一个高维的矩阵,所以用降维加法和降维取平均,能够将一个高维的矩阵变为一个数字。
有了上面的这些操做,咱们就能够实现基本的损失函数的构建了,好比咱们构建交叉熵损失函数:
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y)+(y_-1)* tf.log(1-y)))
再介绍一个均衡正负样本数量的loss,首先在训练数据中,一般来说正例比较少,负例比较多,如疾病筛查中,有病的占少数而绝大部分人是健康的,这种数量不均衡的数据可能会让分类器倾向于将全部的示例都分为健康人,由于这样总体的准确率可能就能达到90%以上,为此,能够用调整loss权重的方式来缓解样本数量不均衡的问题,如:
pos_ratio=num_of_positive/num_all # 病人占整体的比例,较小如0.1
neg_ratio=num_of_negative/num_all # 正常人占整体的比例,较大如0.9
cross_entropy = tf.reduce_mean(-neg_ratio*tf.reduce_sum(y_ * tf.log(y)+pos_ratio*(y_-1)* tf.log(1-y)))
在这里咱们给病人的损失项乘了一个较大的系数,使得一旦占少数的病人被错分为健康人的时候,代价就很是的大。一样的给正常人的损失项乘了一个较小的系数,使其诊断错误时对网络的影像较小。
这也符合实际状况,即便健康人在筛查时被通知可能患病,只要再进一步检查就能够。可是若是在筛查的时候将病人误分为健康人,那么付出的就多是生命的代价了。
以上是二分类的例子,那么在多分类的时候应该如何作呢?咱们也能够经过乘系数这样的方式解决问题,这里咱们认为标签是one_hot形式的如:
class1_weight=0.2 # 第一类的权重系数
class2_weight=0.5 # 第二类的权重系数
class3_weight=0.3 # 第三类的权重系数
cross_entropy = tf.reduce_mean(-class1_weight*tf.reduce
_sum(y_[:,0] * tf.log(y[:,0])-class2_weight*tf.reduce
_sum(y_[:,1] * tf.log(y[:,1])-class3_weight*tf.reduce
_sum(y_[:,2] * tf.log(y[:,2]))
由于标签和预测的结果都是one_hot的形式,所以在这里y[:,0]就是第一类的几率值,其中第一个维度的长度是minibatch的大小。同理y[:,0]就是第二类的几率值,咱们在不一样的项上乘上不一样类别的权重系数,就能够必定程度上解决样本数量不均衡所带来的困扰。
————————————————
版权声明:本文为CSDN博主「Liu-Kevin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。
原文连接:https://blog.csdn.net/limiyudianzi/article/details/80697711