【小白学PyTorch】7.最新版本torchvision.transforms常用API翻译与讲解
機(jī)器學(xué)習(xí)煉丹術(shù)】的學(xué)習(xí)筆記分享
<<小白學(xué)PyTorch>>
小白學(xué)PyTorch | 6 模型的構(gòu)建訪問遍歷存儲(附代碼)
小白學(xué)PyTorch | 5 torchvision預(yù)訓(xùn)練模型與數(shù)據(jù)集全覽
小白學(xué)PyTorch | 4 構(gòu)建模型三要素與權(quán)重初始化
小白學(xué)PyTorch | 3 淺談Dataset和Dataloader
小白學(xué)PyTorch | 2 淺談訓(xùn)練集驗證集和測試集
小白學(xué)PyTorch | 1 搭建一個超簡單的網(wǎng)絡(luò)
小白學(xué)PyTorch | 動態(tài)圖與靜態(tài)圖的淺顯理解
本文共6000字,12張圖,建議大家有空的時候隨便看看就行。第8課是PyTorch實戰(zhàn)內(nèi)容,更重要。本文有問題或者有疑惑的地方,可以加個人微信進(jìn)行討論。近期在個人朋友圈有一次紅包抽獎活動,也歡迎參加。
參考目錄:
1 基本函數(shù)
1.1 Compose
1.2 RandomChoice
1.3 RandomOrder
2 PIL上的操作
2.1 中心切割CenterCrop
2.2 隨機(jī)切割RandomCrop
2.3 隨機(jī)比例切割
2.4 顏色震顫ColorJitter
2.5 隨機(jī)旋轉(zhuǎn)RandomRotation
2.6 灰度化Grayscale
2.7 size
2.8 概率隨機(jī)(常用)
3 Tensor上的操作
3.1 標(biāo)準(zhǔn)化Normalize
4 PIL,Tensor轉(zhuǎn)換函數(shù)
4.1 ToPILImage
4.2 ToTensor
5 案例代碼分析
老樣子,先看官方對torchvision.transforms的介紹:
這個Transforms是常見的圖像的轉(zhuǎn)換(包含圖像增強(qiáng)等), 然后不同的transforms可以通過Compose函數(shù)連接起來(類似于Sequence把網(wǎng)絡(luò)層連接起來一樣的感覺)。后面的是關(guān)于圖像分割任務(wù)了的介紹,因為入門PyTorch主要是圖像分類,所以后面先不提了。
1 基本函數(shù)
1.1 Compose
【代碼】
torchvision.transforms.Compose(transforms)
【介紹】
將不同的transform壓縮在一起,這是非常重要的函數(shù)
【代碼舉例】
transforms.Compose([transforms.CenterCrop(10),transforms.ToTensor(),])1.2 RandomChoice
【代碼】
torchvision.transforms.RandomChoice(transforms)
【介紹】
用法和Compose相同,是在transform的list中隨機(jī)選擇1個transform進(jìn)行執(zhí)行。
1.3 RandomOrder
【代碼】
torchvision.transforms.RandomOrder(transforms)
【介紹】
用法和Compose相同,是亂序list中的transform。
之前的課程提到了,在torchvision官方的數(shù)據(jù)集中,提供的數(shù)據(jù)是PIL格式的數(shù)據(jù),然后我們需要轉(zhuǎn)成FloatTensor形式的數(shù)據(jù)。因此這里圖像增強(qiáng)的處理也分成在PIL圖片上操作的和在FloatTensor張量上操作的兩種。
2 PIL上的操作
2.1 中心切割CenterCrop
【代碼】
torchvision.transforms.CenterCrop(size)
【介紹】
以PIL圖片中心為中心,進(jìn)行圖片切割。比較常用
【參數(shù)】size (sequence or int) – 想要切割出多大的圖片。如果size是一個整數(shù),那么就切割一個正方形;如果是一個(height,width)的tuple,那么就切割一個長方形。
【代碼舉例】
transforms.Compose([transforms.CenterCrop(10),transforms.ToTensor(),])2.2 隨機(jī)切割RandomCrop
【代碼】
torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant')
【介紹】
和CenterCrop類似,但是是隨機(jī)選取中心進(jìn)行切割的
【參數(shù)】
size也是可以是int可以是tuple(height,width)
padding就是是否對圖片進(jìn)行填充,你可以輸入2元組,表示左右填充和上下填充,也可以輸入四元組,表示左上右下的填充;
pad_if_needed是boolean,一般是True。隨機(jī)選取如果選取的比較邊緣,超出了邊界,那么是否進(jìn)行填充
fill (int),你選擇填充的是0(黑色),還是255(白色)呢?這個盡在padding_mode='constant'時有效
padding_mode表示填充的方法。有四種:'constant', 'edge', 'reflect' or 'symmetric' . 默認(rèn)是constant常數(shù)填充。edge是填充邊緣的那個像素值,一般效果比constant強(qiáng)一些,自己做的項目中;reflect和symmetric都是表示以邊界為軸進(jìn)行鏡像的填充,區(qū)別在于:
reflect:[1,2,3,4,5]進(jìn)行padding=2的時候,那么就是[3,2,1,2,3,4,5,4,3]
symmetric:[1,2,3,4,5]進(jìn)行padding=2的時候,那么就是[2,1,1,2,3,4,5,5,4]
區(qū)別是否重復(fù)邊界的哪一個元素。兩種方法差別不大。
2.3 隨機(jī)比例切割
【代碼】
torchvision.transforms.RandomResizedCrop(size, scale=(0.08, 1.0), ratio=(0.75, 1.3333), interpolation=2)
【介紹】
這個比較有意思,隨機(jī)大小切割圖片,然后再resize到設(shè)置的size大小。
參數(shù)中scale控制切割圖片的大小是原圖的比例,然后ratio控制切割圖片的高寬比(縱橫比),默認(rèn)是從3/4 到 4/3。切割完成后再resize到設(shè)置的size大小。這個方法一般用在訓(xùn)練inception網(wǎng)絡(luò)。
2.4 顏色震顫ColorJitter
【代碼】
torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)【介紹】
隨機(jī)修改亮度brightness,對比度contrast, 飽和度saturation,色相hue
【參數(shù)】
brightness (float or tuple (min, max)) – 如果輸入是一個float,那么建議在選取一個小于1的浮點數(shù)。亮度系數(shù)會從區(qū)間均勻選取,如果我使用這個,我設(shè)置brightness是0.1的話,那么這個系數(shù)就是之間隨機(jī)選取。如果輸入時一個tuple的話,那么就是在 中選取。
contrast (float or tuple (min, max)) – 和上面一樣,也是一個系數(shù)的選取。
saturation (float or tuple (min, max)) – 和上面一樣,也是一個系數(shù)的選取。
hue (float or tuple (min, max)) – hue是色相。這里色相的取值應(yīng)該小于0.5。如果輸入時一個float,那么取值應(yīng)該,系數(shù)在 選取;如果是tuple,那么就是
2.5 隨機(jī)旋轉(zhuǎn)RandomRotation
【代碼】
torchvision.transforms.RandomRotation(degrees, resample=False, expand=False, center=None, fill=None)
【介紹】
就是隨機(jī)的按照角度宣傳圖片
【參數(shù)】
degrees (int or tuple (min,max)) – 老規(guī)矩了,整數(shù)旋轉(zhuǎn)角度就是[-int,int],tuple就是[min,max]
expand (bool, optional) – True就是讓擴(kuò)大圖片,讓圖片可以包括所有內(nèi)容(圖片旋轉(zhuǎn)的話,四個角的信息其實是旋轉(zhuǎn)到了圖片的外面,這個是擴(kuò)大圖片的像素尺寸,如果True在后面還要接一個resize的transforms); 默認(rèn)是False,旋轉(zhuǎn)后的圖片和輸入圖片是同樣的尺寸。
center (2-tuple, optional) – 可以設(shè)置成非圖片中心的旋轉(zhuǎn)
fill (n-tuple or int or float) – 設(shè)置填充像素值的,默認(rèn)是0,一般也會選取0.
2.6 灰度化Grayscale
【代碼】
torchvision.transforms.Grayscale(num_output_channels=1)
【介紹】
這個函數(shù)雖然不重要,但是會用的話可以提高變成速度哈哈。就是把圖片轉(zhuǎn)換成灰度的。
【參數(shù)】
num_output_channels (int) ?– 正常情況下灰度圖片是單通道的,但是這里你可以設(shè)置成3,這樣的話,會輸出3個通道的灰度圖片(三個通道的特征值相同),這樣的話,你就不用修改torchvision的預(yù)訓(xùn)練模型中的輸入接口了。(因為之前提到的,預(yù)訓(xùn)練模型使用ImageNet訓(xùn)練的,輸入都是三通道彩色圖)
2.7 size
【代碼】
torchvision.transforms.Resize(size, interpolation=2)
【介紹】
把PIL圖片resize成指定大小
【參數(shù)】
size (tuple(height,width) or int) – tuple的話就直接resize成指定大小;int的話,就按照比例,讓圖片的短邊長度變成int大小。
interpolation (int, optional) – 插值方法,一般都使用默認(rèn)的PIL.Image.BILINEAR雙重線性插值。
2.8 概率隨機(jī)(常用)
圖像增強(qiáng)有:變成灰度,鏡像,翻轉(zhuǎn),平移,旋轉(zhuǎn)等。
【代碼】
#?變成灰度,輸入輸出通道數(shù)默認(rèn)相同 torchvision.transforms.RandomGrayscale(p=0.1) #?隨機(jī)水平翻轉(zhuǎn) torchvision.transforms.RandomHorizontalFlip(p=0.5) #?隨機(jī)豎直翻轉(zhuǎn) torchvision.transforms.RandomVerticalFlip(p=0.5)【參數(shù)】
p:表示執(zhí)行這個transform的概率
3 Tensor上的操作
3.1 標(biāo)準(zhǔn)化Normalize
【代碼】
torchvision.transforms.Normalize(mean,?std,?inplace=False)【參數(shù)】
mean和std都是list,[mean_1,...,mean_n]和[std_1,...,std_n],n為通道數(shù)。每一個通道都應(yīng)該有一個mean和std。計算的方法是,就是常用的那種:
4 PIL,Tensor轉(zhuǎn)換函數(shù)
4.1 ToPILImage
torchvision.transforms.ToPILImage(mode=None)【介紹】
把一個tensor或者np的array轉(zhuǎn)換成PIL。值得注意的是,如果輸入時Tensor,那么維度應(yīng)該是 C x H x W ,如果是numpy的話,是 H x W x C。 (這是一個一般不會出現(xiàn),但是一旦出現(xiàn)很難想到的問題。)
4.2 ToTensor
torchvision.transforms.ToTensor【介紹】
把PIL或者numpy轉(zhuǎn)換成Tensor。PIL和Numpy (格式H x W x C,范圍[0,255]),轉(zhuǎn)換成Tensor(格式C x H x W,范圍[0,1])
5 案例代碼分析
from?PIL?import?Image from?torchvision?import?transformsdef?loadImage():#?讀取圖片im?=?Image.open("brunch.jpg")im?=?im.convert("RGB")im.show()return?im im?=?loadImage()圖片是我在英國留學(xué)的時候,有一道菜叫無花果土司,雖然不好吃但是好看,原圖:
#從中心裁剪一個600*600的圖像 output?=?transforms.CenterCrop(600)(im) output.show() #?從中心裁一個長為600,寬為800的圖像 output?=?transforms.CenterCrop((600,800))(im) output.show() #隨機(jī)裁剪一個600*600的圖像 output?=?transforms.RandomCrop(600)(im) output.show() #隨機(jī)裁剪一個600*800的圖像 output?=?transforms.RandomCrop((600,800))(im) output.show() #從上、下、左、右、中心各裁一個300*300的圖像 outputs?=?transforms.FiveCrop(300)(im) outputs[4].show()類似的圖片,就不占用painful了
#p默認(rèn)為0.5,這里設(shè)成1,那么就肯定會水平翻轉(zhuǎn) output?=?transforms.RandomHorizontalFlip(p=1.0)(im) output.show() output?=?transforms.RandomVerticalFlip(p=1)(im) output.show() #在(-30,30)之間選擇一個角度進(jìn)行旋轉(zhuǎn) output?=?transforms.RandomRotation(30)(im) output.show() #在60-90之間選擇一個角度進(jìn)行旋轉(zhuǎn) output?=?transforms.RandomRotation((60,90))(im) output.show() output?=?transforms.Resize((400,500))(im) output.show()這個圖像一樣就尺寸變小了,就不放圖了。
trans?=?transforms.Compose([transforms.CenterCrop(300),transforms.RandomRotation(30),]) output?=?trans(im) output.show() - END -往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群1003271085。加入微信群請掃碼進(jìn)群(如果是博士或者準(zhǔn)備讀博士請說明):總結(jié)
以上是生活随笔為你收集整理的【小白学PyTorch】7.最新版本torchvision.transforms常用API翻译与讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 彻底掌握机器学习的6个主流模型,是什么水
- 下一篇: 【深度学习】迁移学习理论与实践