色块网站,网站后台代码如何做,福田企业网站优化最好的方法,个人网站做项目前言#xff1a;因为我深度学习主要用于图像分割#xff0c;所以交叉熵损失函数主要侧重在图像分割。 交叉熵损失函数 介绍公式交叉熵函数存在什么问题带权重的交叉熵函数代码 介绍
交叉熵损失函数#xff08;Cross-Entropy Loss#xff09;是深度学习中常用的一种损失函…前言因为我深度学习主要用于图像分割所以交叉熵损失函数主要侧重在图像分割。 交叉熵损失函数 介绍公式交叉熵函数存在什么问题带权重的交叉熵函数代码 介绍
交叉熵损失函数Cross-Entropy Loss是深度学习中常用的一种损失函数特别是处理分类问题。该函数起源于信息论中的交叉熵概念用于衡量两个概率分布间的差异可以衡量预估概率分布和真实样品对应概率分布之间的差异。
从这个概念上理解会让人感觉很抽象建议直接从公式来进行理解。
公式
二分类 H ( y , y ^ ) − 1 N ∑ i 1 N [ y i l o g ( y ^ i ) ( 1 − y i ) l o g ( 1 − y ^ i ) ] H(y,\widehat{y})- \frac{1}{N} \sum_{i1}^N[y_ilog(\widehat{y}_i)(1-y_i)log(1-\widehat{y}_i)] H(y,y )−N1i1∑N[yilog(y i)(1−yi)log(1−y i)] 其中y是真实标签 y ^ \widehat{y} y 是预测值N是样本的数量。每个样本都会计算一个损失然后对所有样本的损失求平均。
对于图像来说这里的N可以看作是图像像素点的个数 y ^ \widehat{y} y 是预测每个像素点的值y是每个像素点标签的值一张图像的交叉熵其实就是计算每个像素点预测值和标签插值的平均。
多分类 多分类就是二分类的延申理解的原理都是一样的。 H ( y , y ^ ) − 1 N ∑ i 1 N [ y i 1 l o g ( y ^ i 1 ) y i 2 l o g ( y ^ i 2 ) . . . y i m l o g ( y ^ i m ) ] H(y,\widehat{y})- \frac{1}{N} \sum_{i1}^N[y_{i1}log(\widehat{y}_{i1})y_{i2}log(\widehat{y}_{i2})...y_{im}log(\widehat{y}_{im})] H(y,y )−N1i1∑N[yi1log(y i1)yi2log(y i2)...yimlog(y im)] H ( y , y ^ ) − 1 N ∑ i 1 N ∑ j 1 m [ y i j l o g ( y ^ i j ) ] H(y,\widehat{y})- \frac{1}{N} \sum_{i1}^N\sum_{j1}^m[y_{ij}log(\widehat{y}_{ij})] H(y,y )−N1i1∑Nj1∑m[yijlog(y ij)] 这里的 y ^ \widehat{y} y 和y是one-hot编码目标向量例如 y i [ y i 1 , y i 2 , . . . , y i m ] y_i[y_{i1},y_{i2},...,y_{im}] yi[yi1,yi2,...,yim]。
交叉熵函数存在什么问题
之前我的一篇博客提过使用交叉熵函数面对类别不均衡的时候会出现问题导致结果会偏向更常见的类别对少类别的识别非常差。
产生这点的原因是因为交叉熵的特点就是“平等”地看待每一个样本无论什么类别权重都是一样的。所以当正负样本不均衡时大量简单的负样本会占据主导地位少量的难样本和正样本就会分不出来。
带权重的交叉熵函数
由于交叉熵函数在应对类别不均衡会出现问题于是就有了带权重的交叉熵函数。
带权重的交叉熵函数Weighted cross entropyWCE会在计算交叉熵函数的时候给不同类别前面加入一个权重。
公式 H ( y , y ^ ) − 1 N ∑ i 1 N ∑ j 1 m [ w j y i j l o g ( y ^ i j ) ] H(y,\widehat{y})- \frac{1}{N} \sum_{i1}^N\sum_{j1}^m[w_{j} y_{ij}log(\widehat{y}_{ij})] H(y,y )−N1i1∑Nj1∑m[wjyijlog(y ij)] 其中 w j w_j wj表示对j类别的权重用于增大在预测图上占比例小的类别公式如下 w j N − ∑ 1 N y ^ i j ∑ 1 N y ^ i j w_j \frac{N-\sum_{1}^N\widehat{y}_{ij}}{\sum_{1}^N\widehat{y}_{ij}} wj∑1Ny ijN−∑1Ny ij
补充除了带权重的交叉熵函数能解决样本类别不均衡还有DiceLoss和FocalLoss能用来解决。
代码
PyTorch的话有自带的库能解决
import torch
import torch.nn as nnclass CrossEntropyLoss2d(nn.Module):def __init__(self, weightNone, size_averageTrue):super(CrossEntropyLoss2d, self).__init__()self.nll_loss nn.CrossEntropyLoss(weight, size_average)def forward(self, preds, targets):return self.nll_loss(preds, targets)nn.CrossEntropyLoss(weight, size_average) weight可以指定一个一维的Tensor用来设置每个类别的权重。用C表示类别的个数Tensor的长度应该为C。 size_averagebool类型数据默认情况下为True此时损失是每个minibatch的平均如果设置成False则对每个minibatch求和。