pytorch 损失函数及其应用代码详解

1、criterion=nn.CrossEntropyLoss():交叉熵函数

criterion(prediction,lable)

分类问题中,交叉熵函数是比较常用也是比较基础的损失函数,能够表征真实样本标签和预测概率之间的差值.

1.1任务为二分类时

1)当某个样本的真实标签y=1时,Loss=−lop(p),分类器的预测概率p=Pr(y=1)的概率越小,则分类损失就越大;反之,分类器的预测概率p=Pr(y=1)的概率越大,则分类损失就越小。

2)对于真实标签y=0,Loss=−log(1−p),分类器的预测概率p=Pr(y=1)的概率越大,则损失越大。

例:预测为猫的p=Pr(y=1)概率是0.8,真实标签y=1;预测不是猫的1-p=Pr(y=0)概率是0.2,真实标签为0。

1.2任务为多元分类时

在多元分类的时候,假定有k个类,则类标签集合就是labels=(1,2,3,…,k).如果第i个样本的类标签是k的话,就记为yi,k=1。采用one-hot记法。每个样本的真实标签就是一个one-hot向量,其中只有一个位置记为1。

例:设共有5类,label =3时,one-hot形式如下

N个样本的真实类标签就是一个N行K列的矩阵:

分类器对N个样本的每一个样本都会预测出它属于每个类的概率,这样的概率矩阵P就是N行K列的。

整个样本集合上分类器的对数损失就可以如下定义:

1.3任务为多标签分类时

多标签是在一种图片有多个类别时,比如一张图片同时有猫狗。

与之前不一样的是,预测不再通过softmax计算,而是采用sigmoid把输出限制到(0,1)。正因此预测值得加和不再是1。这里交叉熵单独对每一个类别计算,每一个类别有两种可能的类别,即属于这个类的概率或不属于这个类的概率。

例:单张图片损失计算可以为

loss=loss猫+loss狗+loss兔

各类损失计算如下

loss猫=−(1∗log(0.8)+(1−0)∗log(1−0.8))=−log(0.8)

loss狗=−(1∗log(0.7)+0∗log(0.3))=−log(0.7)

loss兔=−(0∗log(0.1)+1∗log(0.9))=−log(0.9)

对于整体损失可以用下式:

注意:nn.CrossEntropyLoss() 包括了将output进行Softmax操作的,所以直接输入output即可。其中还包括将label转正one-hot编码,所以直接输入label。该函数限制了target的类型为torch.LongTensor。label_tgt = make_variable(torch.ones(feat_tgt.size(0)).long())可在后边直接.long()。其output,label的shape可以不一致

代码:

示例1

import torch

a=torch.tensor([[-0.3830,-0.0102,-1.4235,-0.5212,0.9011]])

#print(a)  tensor([[-0.3830, -0.0102, -1.4235, -0.5212, 0.9011]])

b=torch.tensor([4])

#print(b) tensor([4])

loss_fn = torch.nn.CrossEntropyLoss()

loss=loss_fn(a,b)

#print(loss) tensor(0.7020)

示例2:

import torch

from torch.autograd import Variable

weight = torch.Tensor([1,2,1,1,10])

loss_fn = torch.nn.CrossEntropyLoss(reduce=False, size_average=False, weight=weight)

input = Variable(torch.randn(3, 5)) # (batch_size, C)

target = Variable(torch.LongTensor(3).random_(5)) #这里应该为LongTensor

loss = loss_fn(input, target)

print(input); print(target); print(loss)


人工计算过程:

先把a(相当于output=model(input))进行softmax,

import torch.nn.functional as F

aa=F.softmax(a)

#print(aa)  tensor([[0.1372, 0.1992, 0.0485, 0.1195, 0.4956]])

原来CrossEntropyLoss() 会把target变成ont-hot形式,我们现在例子的样本标签是 [4](从0开始计算)。那么转换成one-hot编码就是[0,0,0,0,1],

loss=-1*log(0.4956)

这里的log是10为底的(很奇怪)

示例3:

criterion = nn.BCEWithLogitsLoss()

pred_concat = critic(feat_concat.detach())

#print(pred_concat.shape) torch.Size([100, 2])

label_src = make_variable(torch.ones(feat_src.shape[0]).long()) #1 is true

label_tgt = make_variable(torch.zeros(feat_tgt.shape[0]).long())  # 0 is false

label_concat = torch.cat((label_src, label_tgt))

loss_critic = criterion(pred_concat, label_concat)

  

2、criterion=nn.BCEWithLogitsLoss()

二分类用的交叉熵.

criterion(input,target):

注意input,target的shape必须相等,且input应该为FloatTensor的类型。

代码:

criterion = nn.BCEWithLogitsLoss()

pred_concat = critic(feat_concat.detach()) #模型的输出:一个矩阵

#print(pred_concat.shape) torch.Size([100, 2])

prediction_concat=torch.squeeze(pred_concat.max(1)[0])

#print(prediction_concat.shape) torch.Size([100])

# prepare real and fake label

label_src = make_variable(torch.ones(feat_src.shape[0]))  #1 is true

label_tgt = make_variable(torch.zeros(feat_tgt.shape[0]))  # 0 is false

label_concat = torch.cat((label_src, label_tgt))

#print(label_concat.shape) torch.Size([100])

# compute loss for critic

loss_critic = criterion(prediction_concat, label_concat)

          

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342