TensorFlow 损失函数

介绍几个常用的损失函数

参考链接:

softamx cross entropy loss

softmax 交叉熵损失函数是我们常用的一种损失函数。

Softmax本身的算法很简单,就是把所有值用e的n次方计算出来,求和后算每个值占的比率,保证总和为1,一般我们可以认为Softmax出来的就是confidence也就是概率。

公式如下:

J(W,b)=imy(i)loga(i) J ( W , b ) = − ∑ i m y ( i ) log ⁡ a ( i )

a(i)=softmax(z(i))=ez(i)iez(i) a ( i ) = s o f t m a x ( z ( i ) ) = e z ( i ) ∑ i e z ( i )

TensorFlow代码:

tf.nn.softmax_cross_entropy_with_logits

softmax_cross_entropy_with_logits(
    _sentinel=None,
    labels=None,
    logits=None,
    dim=-1,
    name=None
)

tf.nn.sparse_softmax_cross_entropy_with_logits

sparse_softmax_cross_entropy_with_logits(
    _sentinel=None,
    labels=None,
    logits=None,
    name=None
)

这两个函数内部实现算法一样,区别是输入参数的不同,前者要求输入参数labelslogits具有相同的shape,都必须为[batch_size, num_classes]。而后者对logits的要求没变,对labels的要求变为了[batch_size],而且值必须是从0开始编码的int32或int64,而且值范围是[0, num_class),如果我们从1开始编码或者步长大于1,会导致某些label值超过这个范围,代码会直接报错退出。

这两个函数由于使用了Softmax,所以都必须是二分类或者多分类问题,目标标签只能有一类有效。这种标签称为onehot-encoding

sigmoid cross entropy loss

公式如下:

targets * -log(sigmoid(logits)) +
    (1 - targets) * -log(1 - sigmoid(logits))

tf.nn.sigmoid_cross_entropy_with_logits

sigmoid_cross_entropy_with_logits(
    _sentinel=None,
    labels=None,
    logits=None,
    name=None
)

tf.nn.weighted_cross_entropy_with_logits

weighted_cross_entropy_with_logits(
    targets,
    logits,
    pos_weight,
    name=None
)

这个函数的输入是logitslabelslogits就是神经网络模型中的最后一层,注意不需要经过sigmoid,两者的shape必须相同。

例如这个模型一次要判断100张图是否包含10种动物,这两个输入的shape都是[100, 10]。注释中还提到这10个分类之间是独立的、不要求是互斥,这种问题我们成为多目标,例如判断图片中是否包含10种动物,label值可以包含多个1或0个1。

对于tf.nn.weighted_cross_entropy_with_logits函数,可以理解为加权的sigmoid_cross_entropy_with_logits,正样本算出的值乘以某个系数, 公式如下:

targets * -log(sigmoid(logits)) * pos_weight +
    (1 - targets) * -log(1 - sigmoid(logits))

均方差(MSE,mean squared error)

适用于回归问题的损失函数。公式如下:

MSE(y,a)=ni=1(ya)2n M S E ( y , a ) = ∑ i = 1 n ( y − a ) 2 n

自定义损失函数

假设要如下如下自定义的损失函数:

Loss(y,a)=i=1nf(y(i),a(i)),f(x,y)={a(xy),x<yb(yx),x>y L o s s ( y , a ) = ∑ i = 1 n f ( y ( i ) , a ( i ) ) , f ( x , y ) = { a ( x − y ) , x < y b ( y − x ) , x > y

loss= tf.reduce_sum(tf.where(tf.greater(y, y_), (y-y_)*loss_more,(y_-y)*loss_less))

tf.greater(x,y),返回x>y的判断结果的bool型tensor,当tensor x, y的维度不一致时,采取广播(broadcasting)机制。

tf.where(condition,x=None, y=None, name=None),根据condition选择x (if true) or y (if false)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值