一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 深入理解Pytorch微調(diào)torchvision模型

深入理解Pytorch微調(diào)torchvision模型

2022-02-27 13:59柚子味的羊 Python

PyTorch是一個(gè)基于Torch的Python開(kāi)源機(jī)器學(xué)習(xí)庫(kù),用于自然語(yǔ)言處理等應(yīng)用程序。它主要由Facebookd的人工智能小組開(kāi)發(fā),不僅能夠 實(shí)現(xiàn)強(qiáng)大的GPU加速,同時(shí)還支持動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò),這一點(diǎn)是現(xiàn)在很多主流框架如TensorFlow都不支持的

一、簡(jiǎn)介

在本小節(jié),深入探討如何對(duì)torchvision進(jìn)行微調(diào)和特征提取。所有模型都已經(jīng)預(yù)先在1000類(lèi)的magenet數(shù)據(jù)集上訓(xùn)練完成。 本節(jié)將深入介紹如何使用幾個(gè)現(xiàn)代的CNN架構(gòu),并將直觀展示如何微調(diào)任意的PyTorch模型。
本節(jié)將執(zhí)行兩種類(lèi)型的遷移學(xué)習(xí):

  • 微調(diào):從預(yù)訓(xùn)練模型開(kāi)始,更新我們新任務(wù)的所有模型參數(shù),實(shí)質(zhì)上是重新訓(xùn)練整個(gè)模型。
  • 特征提取:從預(yù)訓(xùn)練模型開(kāi)始,僅更新從中導(dǎo)出預(yù)測(cè)的最終圖層權(quán)重。它被稱(chēng)為特征提取,因?yàn)槲覀兪褂妙A(yù)訓(xùn)練的CNN作為固定 的特征提取器,并且僅改變輸出層。

通常這兩種遷移學(xué)習(xí)方法都會(huì)遵循一下步驟:

  • 初始化預(yù)訓(xùn)練模型
  • 重組最后一層,使其具有與新數(shù)據(jù)集類(lèi)別數(shù)相同的輸出數(shù)
  • 為優(yōu)化算法定義想要的訓(xùn)練期間更新的參數(shù)
  • 運(yùn)行訓(xùn)練步驟

二、導(dǎo)入相關(guān)包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from __future__ import print_function
from __future__ import division
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import torchvision
from torchvision import datasets,models,transforms
import matplotlib.pyplot as plt
import time
import os
import copy
print("Pytorch version:",torch.__version__)
print("torchvision version:",torchvision.__version__)

運(yùn)行結(jié)果

深入理解Pytorch微調(diào)torchvision模型

三、數(shù)據(jù)輸入

數(shù)據(jù)集——>我在這里

鏈接:https://pan.baidu.com/s/1G3yRfKTQf9sIq1iCSoymWQ
提取碼:1234

?
1
2
3
4
5
6
7
8
9
10
11
12
#%%輸入
data_dir="D:\Python\Pytorch\data\hymenoptera_data"
# 從[resnet,alexnet,vgg,squeezenet,desenet,inception]
model_name='squeezenet'
# 數(shù)據(jù)集中類(lèi)別數(shù)量
num_classes=2
# 訓(xùn)練的批量大小
batch_size=8
# 訓(xùn)練epoch數(shù)
num_epochs=15
# 用于特征提取的標(biāo)志。為FALSE,微調(diào)整個(gè)模型,為T(mén)RUE只更新圖層參數(shù)
feature_extract=True

四、輔助函數(shù)

1、模型訓(xùn)練和驗(yàn)證

  • train_model函數(shù)處理給定模型的訓(xùn)練和驗(yàn)證。作為輸入,它需要PyTorch模型、數(shù)據(jù)加載器字典、損失函數(shù)、優(yōu)化器、用于訓(xùn)練和驗(yàn) 證epoch數(shù),以及當(dāng)模型是初始模型時(shí)的布爾標(biāo)志。
  • is_inception標(biāo)志用于容納 Inception v3 模型,因?yàn)樵擉w系結(jié)構(gòu)使用輔助輸出, 并且整體模型損失涉及輔助輸出和最終輸出,如此處所述。 這個(gè)函數(shù)訓(xùn)練指定數(shù)量的epoch,并且在每個(gè)epoch之后運(yùn)行完整的驗(yàn)證步驟。它還跟蹤最佳性能的模型(從驗(yàn)證準(zhǔn)確率方面),并在訓(xùn)練 結(jié)束時(shí)返回性能最好的模型。在每個(gè)epoch之后,打印訓(xùn)練和驗(yàn)證正確率。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#%%模型訓(xùn)練和驗(yàn)證
device=torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
def train_model(model,dataloaders,criterion,optimizer,num_epochs=25,is_inception=False):
    since=time.time()
    val_acc_history=[]
    best_model_wts=copy.deepcopy(model.state_dict())
    best_acc=0.0
    for epoch in range(num_epochs):
        print('Epoch{}/{}'.format(epoch, num_epochs-1))
        print('-'*10)
        # 每個(gè)epoch都有一個(gè)訓(xùn)練和驗(yàn)證階段
        for phase in['train','val']:
            if phase=='train':
                model.train()
            else:
                model.eval()
                
            running_loss=0.0
            running_corrects=0
            # 迭代數(shù)據(jù)
            for inputs,labels in dataloaders[phase]:
                inputs=inputs.to(device)
                labels=labels.to(device)
                # 梯度置零
                optimizer.zero_grad()
                # 向前傳播
                with torch.set_grad_enabled(phase=='train'):
                    # 獲取模型輸出并計(jì)算損失,開(kāi)始的特殊情況在訓(xùn)練中他有一個(gè)輔助輸出
                    # 在訓(xùn)練模式下,通過(guò)將最終輸出和輔助輸出相加來(lái)計(jì)算損耗,在測(cè)試中值考慮最終輸出
                    if is_inception and phase=='train':
                        outputs,aux_outputs=model(inputs)
                        loss1=criterion(outputs,labels)
                        loss2=criterion(aux_outputs,labels)
                        loss=loss1+0.4*loss2
                    else:
                        outputs=model(inputs)
                        loss=criterion(outputs,labels)
                        
                    _,preds=torch.max(outputs,1)
                    
                    if phase=='train':
                        loss.backward()
                        optimizer.step()
                        
                # 添加
                running_loss+=loss.item()*inputs.size(0)
                running_corrects+=torch.sum(preds==labels.data)
                
            epoch_loss=running_loss/len(dataloaders[phase].dataset)
            epoch_acc=running_corrects.double()/len(dataloaders[phase].dataset)
            
            print('{}loss : {:.4f} acc:{:.4f}'.format(phase, epoch_loss,epoch_acc))
            
            if phase=='train' and epoch_acc>best_acc:
                best_acc=epoch_acc
                best_model_wts=copy.deepcopy(model.state_dict())
            if phase=='val':
                val_acc_history.append(epoch_acc)
            
        print()
 
    time_elapsed=time.time()-since
    print('training complete in {:.0f}s'.format(time_elapsed//60, time_elapsed%60))
    print('best val acc:{:.4f}'.format(best_acc))
    
    model.load_state_dict(best_model_wts)
    return model,val_acc_history

2、設(shè)置模型參數(shù)的'.requires_grad屬性'

當(dāng)我們進(jìn)行特征提取時(shí),此輔助函數(shù)將模型中參數(shù)的 .requires_grad 屬性設(shè)置為False。
默認(rèn)情況下,當(dāng)我們加載一個(gè)預(yù)訓(xùn)練模型時(shí),所有參數(shù)都是 .requires_grad = True,如果我們從頭開(kāi)始訓(xùn)練或微調(diào),這種設(shè)置就沒(méi)問(wèn)題。
但是,如果我們要運(yùn)行特征提取并且只想為新初始化的層計(jì)算梯度,那么我們希望所有其他參數(shù)不需要梯度變化。

?
1
2
3
4
5
#%%設(shè)置模型參數(shù)的.require——grad屬性
def set_parameter_requires_grad(model,feature_extracting):
    if feature_extracting:
        for param in model.parameters():
            param.require_grad=False

靚仔今天先去跑步了,再不跑來(lái)不及了,先更這么多,后續(xù)明天繼續(xù)~(感謝有人沒(méi)有催更!感謝監(jiān)督!希望繼續(xù)監(jiān)督!)

以上就是深入理解Pytorch微調(diào)torchvision模型的詳細(xì)內(nèi)容,更多關(guān)于Pytorch torchvision模型的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://blog.csdn.net/qq_43368987/article/details/121170137

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲伦理影院 | 亚洲国产AV无码综合在线 | 性欧美video 性满足久久久久久久久 | 亚洲视频在线免费观看 | 男女一级簧色带 | www久久久| 丁香六月婷婷激情 | 女黑人尺寸bbb | 天天草b | 暖暖视频免费观看视频中国.韩剧 | 国产一区二区三区久久小说 | 日本中文字幕一区二区三区不卡 | 韩国久久精品 | 国内外成人在线视频 | 舔到喷水 | 暖暖免费高清完整版观看日本 | 青青青久在线视频免费观看 | 欧美人xxxxxbbbb| 欧美vpswindowssex 欧美va在线高清 | 肉浦团在线观看 | 四虎最新免费网址 | 娇妻被又大又粗又长又硬好爽 | 色综合图区 | 99在线在线视频免费视频观看 | 欧美女人p | 天天快乐在线观看 | 男男同gayxxx | 四虎在线最新永久免费 | 小柔的性放荡羞辱日记动漫 | 91噜噜噜在线观看 | 日本无遮挡亲吻膜下面免费 | yy8090韩国日本三理论免费 | 精品无码人妻一区二区免费AV | 男人j放进女人的p免费看视频 | 四虎免费在线观看视频 | 天堂资源在线www中文 | 校草太大了h | 向日葵视频app下载18岁以下勿看 | 久久re这里精品在线视频7 | 久久久WWW免费人成精品 | 国产成人精品一区二三区在线观看 |