PyTorch框架:(6)图像识别实战常用模块解读
1、TorchVision
官網:torchvision — Torchvision 0.10.0 documentation
在torchvision這個模塊當中,包含了很多后續需要的功能:
需要自己安裝這個模塊pip install torchvision。安裝完之后我們就可以使用這里邊的三大核心模塊了。
(1)torchvision.datasets里邊不止封裝了我們常用的數據集,可以下載和使用的;并且還定義了一些方法,比如數據該如何存放,然后讓我們分類模型構建的更方便一些。
(2)models模塊里邊包含了很多經典網絡架構的實現,還可以拿到他們預訓練的模型(訓練好的權重和偏置),要這些權重和偏置的作用(在我們訓練網絡模型的時候我們得對權重和偏置自己初始化,接下來去訓練,不斷的調解w和b,但是可能會存在一個問題,我們自己訓練的模型可能收斂的比較慢,收斂程度可能也不是很好,人家訓練的模型有一個好處,人家訓練的模型任務可能跟我們差不多,他們訓練好的卷積層和池化層跟我們現在要用的卷積和全連接帶參數的這些也是類似的,那么用他們的權重參數幫我們初始化會使得訓練更容易一些,之后會給大家演示如何做遷移學習(拿人家的權重當做我們的初始化)這件事)
(3)torchvision.transforms模塊:當我們讀進來數據比如一個圖像數據,我們可以對這個圖像數據做一個預處理,比如說一些resize操作,去均值,標準化,然后再做一些data Augmentation數據增強(樣本數據能夠變換的更多一些)操作,這些在transforms中都有,人家都幫我們實現好了,所以圖像預處理操作,transforms里邊都有,我們直接用就好了。
2、分類任務數據集定義預配置
2.1、數據文件夾的定義:
?
3、花朵分類任務 實戰
?3.1、導入模塊
??
?3.2、數據讀取與預處理
3.2.1、數據讀取
?3.2.2、數據預處理
??數據增強:
比如說我現在有了一張貓的圖像,但是我就一張圖像,我能不能讓這張圖像更多一些呢?所以可以直接把這張圖像做一個翻轉,就是另外的一個圖像,就把一張圖像變成兩張圖像,這只是其中一種方法(所以其中一個功能就是我們原始的輸入數據可能沒有那么多,那我得想辦法讓數據量更多起來);還可以對貓做旋轉,他還是一個貓,只不過是圖像里邊的像素點全變了,這個圖像矩陣全變了,這就是我們得到了新的數據,這是旋轉也是比較常見的;對貓進行放大和縮小,可能爪子沒了只剩下臉了,但是還是一個貓,我就得到了另外的一個圖像了;也可以旋轉翻轉縮放組合起來使用。只要我們對數據做了一個圖像當中的變化,就可以得到另外的一些數據;數據增強要做的其中一件事就是這個,擴大數據量。一張圖像只利用了一次太浪費了,可以變換一下多利用幾次。
?
PS:torchvision模塊里邊給我們提供了data Augmentation里邊常用的一些方法,這個模塊里邊提供好了,這樣就不用再使用opencv去做了,torchvision里邊幾行代碼就搞定了。
數據增強在代碼中的實現:
第一步:指定一個data_transforms,data_transforms是這樣的我先按照流水線的模式去寫一寫,一旦圖像來了之后,他的一個變化換都先經過哪個變換,然后再經過哪個變換,再經過哪個變換,按照順序去寫;
對數據做一個角度的旋轉:transforms.RandomRotation(45)這里的45并不是說只旋轉45度,而是在+45或者-45之間隨機的選擇一個角度進行旋轉。(我們要做數據增強,一般都會強調隨機)
裁剪:我們拿到的數據可能有的大有的小規格不一,先需要做一個resize操作,一般先將圖像resize成256x256的,然后再裁剪;這里CenterCop(224)以中心進行裁剪,就留下一個224x224的區域;也可以進行隨機裁剪,這樣隨機裁剪的話224x224的區域就會很多了。
反轉:水平翻轉、豎直反轉;RandomHorizontalFilp和RandomVerticalFilp,做一個鏡面變換,原來貓在左邊,變到右邊的過程;傳進來p是概率表示一張圖像當去執行我們這樣的流水線的時候,執行翻轉到這一步的時候,他會選擇隨機的概率,他有50%的概率會去執行這個翻轉,50%他是不動的;
圖像中的基本變換:亮度、對比度、飽和度、可以傳進來一些參數來做變換;ColorJitter();
灰度圖:此處的概率比較小,只有2.5%的可能性,把我當前的圖像再轉化成灰度圖(如果說原來他就是彩色圖的時候,轉灰度圖保留的也是3通道,只不過說R=G=B都是一樣的)。
transforms.ToTensor做完變換之后把數據轉化成tensor的格式。
做標準化操作,一會會拿別人訓練好的模型去做,比如使用VGG或者Resnet都可以,人家在訓練的時候,比如說在Imagenet上訓練,人家減了個均值除以人家的標準差,做了個標準化操作,為了做遷移學習效果更好,把我們的數據跟人家的越類似越好,人家怎么做的我們就怎么做,他們做了個標準化處理,我們也做一個但是這里我們減的均值和標準差都是人家計算好的(也得拿人家的去做),不能使用自己的。
----------------上述是在訓練集上去做。
驗證集不需要做數據增強,驗證集就是我現在訓練好一個模型之后,我看一下模型效果好不好,把驗證效果往里邊一丟看一下效果就好了。
多了一個resize操作,防止拿的數據非常大,先resize一下,再裁剪成224大小,再轉成tensor的格式,然后再轉化成標準化操作。
PS:在我們做數據的時候,你訓練集是怎么做預處理的,你測試集也得怎么做預處理。
3.3、構建訓練的數據集
第一步: 指定batch_size。
第二步:把數據結構讀進來。使用的是datasets里邊的ImageFolder模塊。(文件夾中數據已經放好了,只用告訴我他當前的一個路徑就好了)
打印查看構建的數據:
----------------------------------至此把數據全部的構建好了--------------
?在數據中還提供了一個json文件:表示的是每一個花它對應的標簽,因為之后在預測的時候我們需要得到的是一個類別值,其實正常情況下先得到他類別的概率值,然后在概率值當中選擇最大的一個,找到當前的概率值對應的是哪個類別,但是我們得到的是類別的編號,比如說23,這里編號對應的是他實際類別的名字,
?展示數據:
?在我們構建好的數據當中,可以把數據讀進來看一看這個數據實際長什么樣子,PS:現在我們做好的tensor做好的數據當中,他都是已經預處理完的數據了,如果說你需要把這個數據拿出來做展示的話,你需要把這些處理過的數據還原回去,還原步驟:
- 正常情況下我們的數據是的,但是在torch當中它的顏色通道是不太一樣的,他是把顏色通道放到了第一個,所以需要執行一個image.transpose操作把這個還原回去。
- ?把做的標準化還原回去,先乘再加。
?只要是迭代一次那就是取了一個batch數據,把這個batch數據拿到手,把數據展示一下,標簽顯示在他的上邊就可以了。
?3.4、加載訓練好的網絡模型
?
?在model中加載人家已經提供的模型,比如說VGG,并且還要用人家已經訓練好的權重來當作我們初始化的參數;
把網絡加載進來,這里使用的是resnet152層網絡來做的?,F在model當中,把這個模型給加載進來,再打印這個模型,看一下一步步人家這個模型是怎么去做的。
?
看一下最后一個全連接層是2048x1000人家的網絡是1000分類的,所以我們需要根據自己的任務需求將1000分類改成我們自己的分類數。拿到別人的模型后,但是別人的模型跟我們的任務可能不太一樣,我們需要改一改。
3.5、初始化模型(參考pytorch官網例子)
參數:模型的名字model_name,?類別個數num_classes;
第一步:加載進來模型,此處添加了一個參數就是pretrained=use_pretrained意思就是要不要把人家的模型也下載下來,模型的網絡架構就是代碼,在代碼當中給他生成就好了;如果要下載別人的預訓練模型必須要有一個下載的操作,如果把pretrained指定為true值,他會自動的幫大家進行下載。
第二步:有選擇性的凍住一些層(把這些層指定為false就是不做訓練,不做更新,即在遷移學習中指定哪些層進行訓練)
第三步:重新的做全連接層,model_ft.fc();
如何去構建一個網絡:第一步把網絡模型拿過來,并且指定pretrained model等于true,相當于用別人訓練好的我們去做;第二步:我們指定要不要把某些層給他凍住,在上邊可以指定,在進行梯度更新時給他指定為False,(即param.requires_grad=False)相當于給他凍住。第三步:需要把最后的全連接層給他修改一下與自己任務一致。
3.6、設置哪些層需要訓練
我們上邊寫了一個函數def initalize_model(),但是還沒有去做,把這個函數實際執行一下,
參數:model_name選擇模型resnet傳進行;實際的分類結果102;選擇要不要去凍住某些層feature_extract;是否使用別人的pretrained model即use_pretrained=True;
3.7、優化器設置?
?學習率一開始指定為lr并沒有特別小,因為下邊有一個學習率衰減的策略,讓他隨著我們的學習慢慢的變小。利用衰減函數optim.lr_scheduler.StepLR()在optim中有一個lr_scheduler學習率衰減的策略StepLR,可以隨著你迭代的step進行一個衰減的,參數是把你的優化器傳進去,然后告訴我一個step_size,迭代多少個epoch之后,學習率衰減多少;gamma就是你衰減的比率;
3.8、訓練模塊
?參數:model是模型;定義的一個batch,一個batch取數據dateloaders;損失函數criterion;優化器optimizer;訓練多少個epoch,num_epoch;后邊參數可以不用去管,表示要不要去用一些其他的網絡,is_inception;
best_acc表示保存一個最好的準確率,因為在迭代過程當中我要保存模型,我可能不是所有模型都進行保存的,我可能是每一個epoch都要做一個驗證,哪個epoch驗證集效果要好,我把當前這個模型保存下來比較合適,不是保存最后一個而是保存哪個最好。
best_model表示:在學習的過程當中我們要把他學習的結果給他拿到手,在迭代的過程中要進行一個實時的更新,model當中他當前的這個模型或者說權重參數每次更新她都會變,我希望把最好的那次給拿過來保存。
最后加載一個最好的模型當作我們的訓練結果;
3.9、開始訓練
?上述訓練只改變了最后一層,前邊都是保持不變的,再繼續訓練所有的層,訓練全部的網絡(parameter.requires_grad=True)
之前已經保存了一個最好的結果了,接下來再訓練的時候, 把這個模型讀進來在此基礎上進行訓練,(filename就是保存了之前訓練的較好的模型)
?3.10、測試
?所謂測試就是走一遍網絡的前向傳播,傳進來一張圖像,再把model傳進去;先把模型加載進來,
?進行測試:
?
?
?
?
?
?
綠色的表示預測對了,紅色的標識預測錯了;?
總結
以上是生活随笔為你收集整理的PyTorch框架:(6)图像识别实战常用模块解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch框架:(5)使用PyTor
- 下一篇: Computer Vision Task