您好,登錄后才能下訂單哦!
本篇內容主要講解“PyTorch怎么使用標簽平滑正則化”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PyTorch怎么使用標簽平滑正則化”吧!
什么是標簽平滑?在PyTorch中如何去使用它?
在訓練深度學習模型的過程中,過擬合和概率校準(probability calibration)是兩個常見的問題。一方面,正則化技術可以解決過擬合問題,其中較為常見的方法有將權重調小,迭代提前停止以及丟棄一些權重等。另一方面,Platt標度法和isotonic regression法能夠對模型進行校準。但是有沒有一種方法可以同時解決過擬合和模型過度自信呢?
標簽平滑也許可以。它是一種去改變目標變量的正則化技術,能使模型的預測結果不再僅為一個確定值。標簽平滑之所以被看作是一種正則化技術,是因為它可以防止輸入到softmax函數的最大logits值變得特別大,從而使得分類模型變得更加準確。
在這篇文章中,我們定義了標簽平滑化,在測試過程中我們將它應用到交叉熵損失函數中。
標簽平滑?
假設這里有一個多分類問題,在這個問題中,目標變量通常是一個one-hot向量,即當處于正確分類時結果為1,否則結果是0。
標簽平滑改變了目標向量的最小值,使它為ε。因此,當模型進行分類時,其結果不再僅是1或0,而是我們所要求的1-ε和ε,從而帶標簽平滑的交叉熵損失函數為如下公式。
在這個公式中,ce(x)表示x的標準交叉熵損失函數,例如:-log(p(x)),ε是一個非常小的正數,i表示對應的正確分類,N為所有分類的數量。
直觀上看,標記平滑限制了正確類的logit值,并使得它更接近于其他類的logit值。從而在一定程度上,它被當作為一種正則化技術和一種對抗模型過度自信的方法。
PyTorch中的使用
在PyTorch中,帶標簽平滑的交叉熵損失函數實現起來非常簡單。首先,讓我們使用一個輔助函數來計算兩個值之間的線性組合。
deflinear_combination(x, y, epsilon):return epsilon*x + (1-epsilon)*y
下一步,我們使用PyTorch
中一個全新的損失函數:nn.Module
.
import torch.nn.functional as F defreduce_loss(loss, reduction='mean'):return loss.mean() if reduction=='mean'else loss.sum() if reduction=='sum'else loss classLabelSmoothingCrossEntropy(nn.Module):def__init__(self, epsilon:float=0.1, reduction='mean'): super().__init__() self.epsilon = epsilon self.reduction = reduction defforward(self, preds, target): n = preds.size()[-1] log_preds = F.log_softmax(preds, dim=-1) loss = reduce_loss(-log_preds.sum(dim=-1), self.reduction) nll = F.nll_loss(log_preds, target, reduction=self.reduction) return linear_combination(loss/n, nll, self.epsilon)
我們現在可以在代碼中刪除這個類。對于這個例子,我們使用標準的fast.ai pets example
.
from fastai.vision import * from fastai.metrics import error_rate # prepare the data path = untar_data(URLs.PETS) path_img = path/'images' fnames = get_image_files(path_img) bs = 64 np.random.seed(2) pat = r'/([^/]+)_\d+.jpg$' data = ImageDataBunch.from_name_re(path_img, fnames, pat, ds_tfms=get_transforms(), size=224, bs=bs) \ .normalize(imagenet_stats) # train the model learn = cnn_learner(data, models.resnet34, metrics=error_rate) learn.loss_func = LabelSmoothingCrossEntropy() learn.fit_one_cycle(4)
最后將數據轉換成模型可以使用的格式,選擇ResNet架構并以帶標簽平滑的交叉熵損失函數作為優化目標。經過四輪循環后,其結果如下
我們所得結果的錯誤率僅為7.5%,這對于10行左右的代碼來說是完全可以接受的,并且在模型中大多數參數還都選擇的是默認設置。
因此,在模型中還有許多參數可以進行調整,從而使得模型的表現性能更好,例如:可以使用不同的優化器、超參數、模型架構等。
結論
在這篇文章中,我們了解了什么是標簽平滑以及什么時候去使用它,并且我們還知道了如何在PyTorch中實現它。之后,我們訓練了一個先進的計算機視覺模型,僅使用十行代碼就識別出了不同品種的貓和狗。
模型正則化和模型校準是兩個重要的概念。若想成為一個深度學習的資深玩家,就應該好好地去理解這些能夠對抗過擬合和模型過度自信的工具。
作者簡介: Dimitris Poulopoulos,是BigDataStack的一名機器學習研究員,同時也是希臘Piraeus大學的博士。曾為歐盟委員會、歐盟統計局、國際貨幣基金組織、歐洲央行等客戶設計過與AI相關的軟件。
總結
到此,相信大家對“PyTorch怎么使用標簽平滑正則化”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。