日韩欧美一级在线播放_欧美亚洲一区在线_欧美成人在线网站_日韩欧美国产一区二区三区_亚洲三级在线播放_日韩写真欧美这视频_成人av电影观看_日本伦理一区二区_日韩综合视频在线观看_国产成人精品午夜

頻道 > 生活 >   >  正文

深度學(xué)習(xí)之PyTorch實(shí)戰(zhàn)(5)——對(duì)CrossEntropyLoss損失函數(shù)的理解與學(xué)習(xí) 今日熱議

評(píng)論

其實(shí)這個(gè)筆記起源于一個(gè)報(bào)錯(cuò),報(bào)錯(cuò)內(nèi)容也很簡(jiǎn)單,希望傳入一個(gè)三維的tensor,但是得到了一個(gè)四維。

RuntimeError: only batches of spatial targets supported (3D tensors) but got targets of dimension: 4

查看代碼報(bào)錯(cuò)點(diǎn),是出現(xiàn)在pytorch計(jì)算交叉熵?fù)p失的代碼。其實(shí)在自己手寫(xiě)寫(xiě)語(yǔ)義分割的代碼之前,我一直以為自己是對(duì)交叉熵?fù)p失完全了解的。但是實(shí)際上還是有一些些認(rèn)識(shí)不足,所以這里打算復(fù)習(xí)一下,將其重新梳理一下,才算是透徹的理解了,特地記錄下來(lái)。

1,交叉熵?fù)p失的定義理解

交叉熵是信息論中的一個(gè)概念,要想完全理解交叉熵的本質(zhì),需要從基礎(chǔ)的概念學(xué)習(xí)。


(資料圖)

1.1 信息量

信息量與事件發(fā)生的概率有關(guān),某件事情越不可能發(fā)生,我們獲取的信息量就越大,越可能發(fā)生,我們獲取的信息量就越小。

假設(shè)X是一個(gè)離散型隨機(jī)變量,其取值集合為x,概率分布函數(shù) p(x)=Pr(X=x),則定義事件 X=x0的信息量為:

由于是概率,所以P(x0)的取值范圍是[0, 1],繪圖如下:

從圖像可知,函數(shù)符合我們對(duì)信息量的直覺(jué),概率越大,信息量越小。

1.2 熵

對(duì)于某個(gè)事件來(lái)說(shuō),有多種可能性,每一種可能性都有一個(gè)概率 p(Xi),這樣就可能計(jì)算出某一種可能性的信息量。因?yàn)槲覀兩厦娑x了信息量的定義,而熵就是表達(dá)所有信息量的期望,即:

而有一類比較特殊的分布問(wèn)題,就是0-1分布,對(duì)于這類問(wèn)題你,熵的計(jì)算方式可以簡(jiǎn)化為圖下算式:

1.3 相對(duì)熵(KL散度)

如果我們對(duì)同一個(gè)隨機(jī)變量X有兩個(gè)單獨(dú)的概率分布 P(x) 和 Q(x)(在機(jī)器學(xué)習(xí)中,P往往是用來(lái)表示樣本的真實(shí)分布,而Q是表示模型預(yù)測(cè)的分布。),我們可以使用KL散度來(lái)衡量這兩個(gè)分布的差異。計(jì)算公式如下:

n 為事件的所有可能性,Dkl的值越小,表示P和Q的分布越接近。

1.4 交叉熵

對(duì)上式變形可以得到:

等式的前一部分是p的熵,后一部分是交叉熵:

在機(jī)器學(xué)習(xí)中,我們需要評(píng)估label和predict之間的差距,使用KL散度剛剛好。由于KL散度的前一部分 -H(y)不變,故在優(yōu)化過(guò)程中,只需要關(guān)注交叉熵就可以了,所以一般在機(jī)器學(xué)習(xí)中直接用交叉熵做loss,評(píng)估模型。因?yàn)榻徊骒乜坍?huà)的是兩個(gè)概率分布的距離,也就是說(shuō)交叉熵值越小(相對(duì)熵的值越小),兩個(gè)概率分布越接近。

1.5 交叉熵在單標(biāo)簽分類問(wèn)題的使用

這里的單標(biāo)簽分類,就是深度學(xué)習(xí)最基本的分類問(wèn)題,每個(gè)圖像只有一個(gè)標(biāo)簽,只能是label1或者label2。

上圖是一個(gè)樣本loss的計(jì)算方式,n代表n種label,yi表示真實(shí)結(jié)果, yihat表示預(yù)測(cè)概率。如果是一個(gè)batch,則需要除以m(m為當(dāng)前batch的樣本數(shù))。

1.6 交叉熵在多標(biāo)簽分類問(wèn)題的使用

這里的多標(biāo)簽分類是指,每一張圖像樣本可以有多個(gè)類別,多分類標(biāo)簽是n-hot,值得注意的是,這里的pred不再用softmax計(jì)算了,采用的是Sigmoid了。將每一個(gè)節(jié)點(diǎn)的輸出歸一化到0-1之間。所以pred的值的和也不再是1。比如我們的語(yǔ)義分割,每個(gè)像素的label都是獨(dú)立分布的,相互之間沒(méi)有任何影響,所以交叉熵在這里是單獨(dú)對(duì)每一個(gè)節(jié)點(diǎn)進(jìn)行計(jì)算,每一個(gè)節(jié)點(diǎn)只有兩種可能性,所以是一個(gè)二項(xiàng)分布。(上面有簡(jiǎn)化后交叉熵的公式)

每個(gè)樣本的loss即為 loss = loss1 + loss2 + ... lossn。

每一個(gè)batch的loss就是:

其中m為當(dāng)前batch的樣本量,n為類別數(shù)。

2,Pytorch中CrossEntropy的形式

語(yǔ)義分割的本質(zhì)是對(duì)像素的分類。因此語(yǔ)義分割也是使用這個(gè)損失函數(shù)。首先看代碼定義:

def cross_entropy(input, target, weight=None, size_average=None, ignore_index=-100,                  reduce=None, reduction="mean"):    # type: (Tensor, Tensor, Optional[Tensor], Optional[bool], int, Optional[bool], str) -> Tensor    if size_average is not None or reduce is not None:        reduction = _Reduction.legacy_get_string(size_average, reduce)    return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)

從上面代碼可知:input和target是Tensor格式,并且先計(jì)算log_softmax,再計(jì)算nll_loss。(實(shí)際上softmax計(jì)算+ log計(jì)算 + nll_loss 計(jì)算== 直接使用CrossEntropyLoss計(jì)算)

2.1 通過(guò)softmax+log+nll_loss 計(jì)算CrossEntropyLoss

我們直接在語(yǔ)義分割中應(yīng)用:

下面softmax函數(shù)肯定輸出的是網(wǎng)絡(luò)的輸出預(yù)測(cè)圖像,假設(shè)維度為(1,2,2,2),從左到右dim依次為0,1,2,3,也就是說(shuō)類別數(shù)所在的維度表示dim=1應(yīng)在的維度上計(jì)算概率。所以dim=1

temp1 = F.softmax(pred_output,dim=1)print("temp1:",temp1)

log函數(shù):就是對(duì)輸入矩陣的每個(gè)元素求對(duì)數(shù),默認(rèn)底數(shù)為e,也就是In函數(shù)

temp3 = torch.log(temp1)print("temp3:",temp3)

nll_loss函數(shù):這個(gè)函數(shù)的目的是把標(biāo)簽圖像的元素值,作為索引值,在上面選擇相應(yīng)的值求平均。

target = target.long()loss1 = F.nll_loss(temp3,target)print("loss1: ", loss1)
2.2 直接使用交叉熵?fù)p失計(jì)算

直接使用交叉熵?fù)p失計(jì)算:

loss2 = nn.CrossEntropyLoss()result2 = loss2(pred_output, target)print("result2: ", result2)

對(duì)比結(jié)果可以發(fā)現(xiàn) 通過(guò) 對(duì)CrossEntropyLoss函數(shù)分解并分步計(jì)算的結(jié)果,與直接使用CrossEntropyLoss函數(shù)計(jì)算的結(jié)果一致。

2.3 pytorch 和 tensorflow在損失函數(shù)計(jì)算方面的差異

pytorch和tensorflow在損失函數(shù)計(jì)算方面有細(xì)微的差別的,為啥對(duì)比pytorch和tensorflow的差異,因?yàn)橐粋€(gè)更符合人的想法,一個(gè)稍微有一些閹割的問(wèn)題,導(dǎo)致我們按照常理寫(xiě)代碼,會(huì)遇到問(wèn)題。

tensorflow的模型訓(xùn)練:

one-hot編碼:

通過(guò)這兩步驟,我們就可以計(jì)算標(biāo)簽和模型產(chǎn)生的預(yù)測(cè)結(jié)果之間的損失了。而在pytorch中,我們不需要對(duì)標(biāo)簽進(jìn)行one-hot編碼,且需要將通道這一維度壓縮。即標(biāo)簽中的值為對(duì)應(yīng)的類別數(shù)。

具體在代碼中,如果是一個(gè)類別,就特別要注意(因?yàn)槲揖褪菦](méi)注意,所以就有開(kāi)頭的錯(cuò)):

masks_pred = model(images)if model.n_classes == 1:    loss = criterion(masks_pred.squeeze(1), true_masks.float())    loss += dice_loss(F.sigmoid(masks_pred.squeeze(1)), true_masks.float(), multiclass=False)else:    loss = criterion(masks_pred, true_masks)    loss += dice_loss(        F.softmax(masks_pred, dim=1).float(),        F.one_hot(true_masks, model.n_classes).permute(0, 3, 1, 2).float(),        multiclass=True    )
3,Pytorch中,nn與nn.functional的相同點(diǎn)和不同點(diǎn)3.1 相同點(diǎn)

首先兩者的功能相同,nn.xx與nn.functional.xx的實(shí)際功能是相同的,只是一個(gè)是包裝好的類,一個(gè)是可以直接調(diào)用的函數(shù)。

比如我們這里學(xué)習(xí)的Crossentropy函數(shù):

在torch.nn中定義如下:

class CrossEntropyLoss(_WeightedLoss):    __constants__ = ["ignore_index", "reduction", "label_smoothing"]    ignore_index: int    label_smoothing: float    def __init__(self, weight: Optional[Tensor] = None, size_average=None, ignore_index: int = -100,                 reduce=None, reduction: str = "mean", label_smoothing: float = 0.0) -> None:        super(CrossEntropyLoss, self).__init__(weight, size_average, reduce, reduction)        self.ignore_index = ignore_index        self.label_smoothing = label_smoothing    def forward(self, input: Tensor, target: Tensor) -> Tensor:        return F.cross_entropy(input, target, weight=self.weight,                               ignore_index=self.ignore_index, reduction=self.reduction,                               label_smoothing=self.label_smoothing)

在torch.nn.functional中定義如下:

def cross_entropy(    input: Tensor,    target: Tensor,    weight: Optional[Tensor] = None,    size_average: Optional[bool] = None,    ignore_index: int = -100,    reduce: Optional[bool] = None,    reduction: str = "mean",    label_smoothing: float = 0.0,) -> Tensor:    if has_torch_function_variadic(input, target, weight):        return handle_torch_function(            cross_entropy,            (input, target, weight),            input,            target,            weight=weight,            size_average=size_average,            ignore_index=ignore_index,            reduce=reduce,            reduction=reduction,            label_smoothing=label_smoothing,        )    if size_average is not None or reduce is not None:        reduction = _Reduction.legacy_get_string(size_average, reduce)    return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing)

可以看到torch.nn下面的CrossEntropyLoss類在forward時(shí)調(diào)用了nn.functional下的cross_entropy函數(shù),當(dāng)然最終的計(jì)算是通過(guò)C++編寫(xiě)的函數(shù)計(jì)算的。

3.2 不同點(diǎn)

不同點(diǎn)1:在使用nn.CrossEntropyLoss()之前,需要先實(shí)例化,再輸入?yún)?shù),以函數(shù)調(diào)用的方式調(diào)用實(shí)例化的對(duì)象并傳入輸入數(shù)據(jù):

import torch.nn as nnloss = torch.nn.CrossEntropyLoss()output = loss(x, y)

使用 F.cross_entropy()直接可以傳入?yún)?shù)和輸入數(shù)據(jù),而且由于F.cross_entropy() 得到的是一個(gè)向量也就是對(duì)batch中每一個(gè)圖像都會(huì)得到對(duì)應(yīng)的交叉熵,所以計(jì)算出之后,會(huì)使用一個(gè)mean()函數(shù),計(jì)算其總的交叉熵,再對(duì)其進(jìn)行優(yōu)化。

import torch.nn.functional as Floss = F.cross_entropy(input, target).mean()

不同點(diǎn)2:而且 nn.xxx 繼承于nn.Module,能夠很好的與nn.Sequential結(jié)合使用,而nn.functional.xxx 無(wú)法與nn.Sequential結(jié)合使用。舉個(gè)例子:

layer = nn.Sequential(            nn.Conv2d(3, 64, kernel_size=3, padding=1),            nn.BatchNorm2d(num_features=64),            nn.ReLU(),            nn.MaxPool2d(kernel_size=2),            nn.Dropout(0.2)  )

不同點(diǎn)3:nn.xxx 不需要自己定義和管理weight;而nn.functional.xxx需要自己定義weight,每次調(diào)用的時(shí)候都需要手動(dòng)傳入weight,不利于代碼復(fù)用。其實(shí)如果我們只保留了nn.functional下的函數(shù)的話,在訓(xùn)練或者使用時(shí),我們就需要手動(dòng)去維護(hù)weight, bias, stride 這些中間量的值;而如果只保留nn下的類的話,其實(shí)就犧牲了一部分靈活性,因?yàn)樽鲆恍┖?jiǎn)單的計(jì)算都需要?jiǎng)?chuàng)建一個(gè)類,這也與PyTorch的風(fēng)格不符。

比如使用nn.xxx定義一個(gè)網(wǎng)絡(luò),如下:

import torchimport torch.nn as nnimport torch.nn.functional as Fclass Net(nn.Module):    def __init__(self):        super(Net, self).__init__()        self.conv1 = nn.Conv2d(3, 6, 5)        self.pool = nn.MaxPool2d(2, 2)        self.conv2 = nn.Conv2d(6, 16, 5)        self.fc1 = nn.Linear(16 * 5 * 5, 120)        self.fc2 = nn.Linear(120, 84)        self.fc3 = nn.Linear(84, 10)    def forward(self, x):        x = self.pool(F.relu(self.conv1(x)))        x = self.pool(F.relu(self.conv2(x)))        x = x.view(-1, 16 * 5 * 5)        x = F.relu(self.fc1(x))        x = F.relu(self.fc2(x))        x = self.fc3(x)        return x

以一個(gè)最簡(jiǎn)單的五層網(wǎng)絡(luò)為例。需要維持狀態(tài)的,主要是兩個(gè)卷積和三個(gè)線性變換,所以在構(gòu)造Module是,定義了兩個(gè)Conv2d和三個(gè)nn.Linear對(duì)象,而在計(jì)算時(shí),relu之類不需要保存狀態(tài)的可以直接使用。

參考地址(這個(gè)只是個(gè)人筆記,不做商業(yè)):

https://blog.csdn.net/tsyccnh/article/details/79163834

https://www.zhihu.com/question/66782101

https://blog.csdn.net/weixin_39190382/article/details/114433884)

https://blog.csdn.net/Fcc_bd_stars/article/details/105158215

標(biāo)簽:

今日熱點(diǎn)

熱點(diǎn)排行

最近更新

所刊載信息部分轉(zhuǎn)載自互聯(lián)網(wǎng),并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。郵箱:5855973@qq.com

聯(lián)系我們| 中國(guó)品牌網(wǎng) | 滬ICP備2022005074號(hào)-18 營(yíng)業(yè)執(zhí)照  Copyright © 2018@. All Rights Reserved.

日韩欧美一级在线播放_欧美亚洲一区在线_欧美成人在线网站_日韩欧美国产一区二区三区_亚洲三级在线播放_日韩写真欧美这视频_成人av电影观看_日本伦理一区二区_日韩综合视频在线观看_国产成人精品午夜
亚洲欧美日韩国产综合| 久久久激情视频| 日韩精品一区二区三区视频播放 | 日韩精品成人一区二区三区| 夜色激情一区二区| 成人永久免费视频| 国产一区二区精品久久91| 欧美一区二区三区视频在线| 日韩一区二区三区免费看 | 国产精品福利av| av一二三不卡影片| 成人av片在线观看| 亚洲成人三级小说| 亚洲日本va在线观看| 国产女同性恋一区二区| 色综合久久中文综合久久牛| 欧美mv日韩mv国产网站| 亚洲综合一二区| 欧美精品自拍偷拍动漫精品| 日韩一级大片在线| 亚洲自拍偷拍综合| 波多野结衣欧美| 亚洲国产精品成人综合色在线婷婷 | 成人做爰69片免费看网站| 国产精品拍天天在线| 亚洲精品成人精品456| 日韩欧美一区二区免费| 在线综合视频播放| 亚瑟在线精品视频| 欧美日韩一区国产| 国产精品乱子久久久久| 一区二区三区久久久| 3751色影院一区二区三区| 国产综合色在线视频区| 成人午夜电影网站| 精品一区二区三区免费视频| 国产精品国产三级国产aⅴ入口| 欧美亚洲图片小说| 高清久久久久久| 亚洲欧美日韩在线| 日本韩国精品在线| 亚洲精品日韩专区silk| 国产精品久久毛片a| 欧美久久久久久久久| 性久久久久久久久| 国产乱码字幕精品高清av| 国产精品久久久久三级| 欧美成人精品二区三区99精品| 国产精品理论片| 91亚洲永久精品| 成人一区二区在线观看| 理论电影国产精品| 国产精品麻豆一区二区| 亚洲伊人色欲综合网| 中文av一区特黄| 久久久国产精品麻豆| www.欧美.com| 欧美三级资源在线| 欧美亚洲国产一区二区三区| 成人免费视频播放| 91福利视频网站| 欧美性大战久久| 在线不卡中文字幕播放| 精品影视av免费| 韩国中文字幕2020精品| 国产91高潮流白浆在线麻豆 | 亚洲午夜久久久久久久久久久| 99精品久久只有精品| 国产精品国产三级国产普通话蜜臀| ...中文天堂在线一区| 不卡视频在线看| 亚洲一区二区三区激情| 久久久久久夜精品精品免费| 欧美一区二区精品久久911| 99久久精品情趣| 国产黄色成人av| 国产成人福利片| 一区二区三区资源| 国产不卡视频在线播放| 国产日韩欧美综合一区| 亚洲欧洲性图库| 91精品国产综合久久香蕉麻豆 | 国产精品一区二区免费不卡| 国产露脸91国语对白| 久久久久国产精品厨房| 国产一区二区三区免费| 欧美影片第一页| 久草这里只有精品视频| 久久久91精品国产一区二区精品| 狠狠色丁香久久婷婷综| 欧美色综合网站| 欧美va亚洲va在线观看蝴蝶网| 国产乱码精品一品二品| 一区二区三区免费网站| 日韩三级在线免费观看| 97精品国产97久久久久久久久久久久| 亚洲国产综合91精品麻豆| 日韩欧美中文字幕制服| 久久成人久久鬼色| 久久综合资源网| 99久久久无码国产精品| 国产毛片精品视频| 欧美日韩一区二区三区视频| 亚洲一区二区三区激情| 国产亚洲精久久久久久| 欧美久久一二三四区| 91网站黄www| 欧美午夜精品久久久| 免费在线观看一区二区三区| 久久精品日韩一区二区三区| 99精品热视频| 中文字幕av一区二区三区免费看 | 国精产品一区一区三区mba视频| 精品欧美一区二区三区精品久久| 国产又粗又猛又爽又黄91精品| 午夜成人免费电影| 精品一区二区在线观看| 五月天激情综合网| www.久久精品| 91丨九色porny丨蝌蚪| 欧美精品在线一区二区| 欧美日韩欧美一区二区| 中文字幕在线不卡| 激情深爱一区二区| 成人h动漫精品一区二区| 麻豆久久久久久| 日韩免费观看2025年上映的电影| 亚洲人成精品久久久久| 国产乱人伦偷精品视频免下载| 91 com成人网| 精品亚洲aⅴ乱码一区二区三区| 一本久久精品一区二区| 亚洲蜜桃精久久久久久久| 91免费视频网| 日本大胆欧美人术艺术动态| 欧美一区二区在线视频| 视频一区二区中文字幕| 91久久国产最好的精华液| 国产精品国产三级国产aⅴ无密码| 色视频一区二区| 91麻豆精品国产91久久久资源速度 | 久久国产精品99久久人人澡| 欧美国产激情一区二区三区蜜月| 福利一区二区在线观看| 久久精品免费在线观看| 成人污污视频在线观看| 国产欧美一区二区三区鸳鸯浴 | 欧美中文字幕亚洲一区二区va在线| 日韩中文字幕麻豆| 久久午夜国产精品| 色av一区二区| 日韩国产欧美在线观看| 国产精品国产三级国产专播品爱网 | 久草中文综合在线| 亚洲日本乱码在线观看| 日韩美女在线视频| 免费人成在线不卡| 国产精品99久久久| 亚洲精品大片www| 精品久久人人做人人爱| 日韩国产高清影视| 丝袜脚交一区二区| 精品一区二区三区久久| 91理论电影在线观看| 亚洲精品高清视频在线观看| 成人小视频免费观看| 亚洲成人激情综合网| 婷婷开心久久网| 国内精品自线一区二区三区视频| 一区二区激情小说| 亚洲动漫第一页| 久久精品99国产精品| 国产传媒日韩欧美成人| 亚洲国产欧美在线| 精品国产乱码久久久久久图片 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 91女厕偷拍女厕偷拍高清| 色噜噜久久综合| 欧美一区二区三区喷汁尤物| 亚洲一区二区视频| 69精品人人人人| www.综合网.com| 欧美激情一区二区三区| 波多野结衣一区二区三区| 亚洲另类一区二区| 欧美精品乱码久久久久久按摩| 日韩精品一区二区在线观看| 国产精品久久久久久久久搜平片 | 国产精品亚洲一区二区三区妖精 | 欧美大片在线观看| 韩国女主播一区二区三区| 国产精品女人毛片| 国产美女视频91| 亚洲精品免费在线观看| 日韩精品一区二区三区蜜臀| 成人黄色综合网站| 美日韩一区二区三区| 亚洲欧美在线视频观看| 国产亚洲精品久| 9i看片成人免费高清|