【pytorch】微调技术
生活随笔
收集整理的這篇文章主要介紹了
【pytorch】微调技术
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
訓練神經網絡是一件非常耗費時間的事情,其需要大量的算力以及大量的數據。顯然從頭開始訓練并不是明智之選,利用好已有的資源才是明智之選。
微調技術
圖像識別籠統地可以分為兩步:
- 識別一只貓和識別一只狗有沒有類似的地方呢?
答案是有的,它們在提取圖片特征都是非常相似的。
考慮CNN中卷積的作用,它就是在識別不同的邊緣,因此無論是貓,還是狗,圖片特征都是類似的,但是如何根據這些特征來學習才是關鍵。
預訓練模型
在圖像識別中,有許多經典的神經網絡,例如vgg,resnet等,對于這些經典的網絡,pytorch都是提供了訓練模型好的模型的。這些某些都是在ImageNet上訓練好的,有較高的精確度。利用訓練好的某些進行圖片特征的提取,就能夠大大減少訓練的耗時。
代碼實現
import torch from torch import nn from torch.nn import functional as F from torchsummary import summarynet = torchvision.models.resnet18(pretrained=True)net.fc = nn.Linear(net.fc.in_features, 5) nn.init.xavier_uniform_(net.fc.weight) summary(net , input_size=(3,224,224) , device="cpu")lr = 0.0005 loss = nn.CrossEntropyLoss(reduction="mean")params_1x = [param for name, param in net.named_parameters()if name not in ["fc.weight", "fc.bias"]] trainer = torch.optim.SGD([{'params': params_1x},{'params': net.fc.parameters(),'lr': lr * 80}],lr=lr, weight_decay=0.001) epochs = 15其實非常簡單,甚至比自己完全手動定義神經網絡都簡單,因為它完全不需要自己定義網絡結構。
但是這些與訓練模型并不是能夠直接拿過來就能使用的,還需要一些修改:
在ImageNet中,其最后的全連接層是一個輸出為100010001000的向量,也就是代表著100010001000個類別,在實際中,需要根據當前識別認為的類別數進行修改。
一般來說,預訓練好的參數無需修改,可以將其設為無需學習的參量,也可以將其的學習率設置的非常小。而對于最后的全連接層,也就是對提取出來的圖片信息進行分類的網絡,其學習率就要比較大了。
作用與意義
微調技術可謂是沒有足夠算力人的福音了,其大大減少了訓練的成本。
不足與局限性
并不是所有情況都能使用微調技術的,在圖片特征出現顯著差異的時候,使用微調技術往往不能得到滿意的結果。
比如,在ImageNet上訓練的模型都是基于正常圖片的,但是如果將它用于識別醫學影像(X光片等)就會導致失敗。同樣用這個模型去識別卡通圖片也往往會識別。
總結
以上是生活随笔為你收集整理的【pytorch】微调技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 非常全面的IReport的使用
- 下一篇: Pun2插件结合Xlua热更新开发 一、