激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

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

服務器之家 - 腳本之家 - Python - 深入理解Pytorch微調torchvision模型

深入理解Pytorch微調torchvision模型

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

PyTorch是一個基于Torch的Python開源機器學習庫,用于自然語言處理等應用程序。它主要由Facebookd的人工智能小組開發,不僅能夠 實現強大的GPU加速,同時還支持動態神經網絡,這一點是現在很多主流框架如TensorFlow都不支持的

一、簡介

在本小節,深入探討如何對torchvision進行微調和特征提取。所有模型都已經預先在1000類的magenet數據集上訓練完成。 本節將深入介紹如何使用幾個現代的CNN架構,并將直觀展示如何微調任意的PyTorch模型。
本節將執行兩種類型的遷移學習:

  • 微調:從預訓練模型開始,更新我們新任務的所有模型參數,實質上是重新訓練整個模型。
  • 特征提取:從預訓練模型開始,僅更新從中導出預測的最終圖層權重。它被稱為特征提取,因為我們使用預訓練的CNN作為固定 的特征提取器,并且僅改變輸出層。

通常這兩種遷移學習方法都會遵循一下步驟:

  • 初始化預訓練模型
  • 重組最后一層,使其具有與新數據集類別數相同的輸出數
  • 為優化算法定義想要的訓練期間更新的參數
  • 運行訓練步驟

二、導入相關包

?
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__)

運行結果

深入理解Pytorch微調torchvision模型

三、數據輸入

數據集——>我在這里

鏈接: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'
# 數據集中類別數量
num_classes=2
# 訓練的批量大小
batch_size=8
# 訓練epoch數
num_epochs=15
# 用于特征提取的標志。為FALSE,微調整個模型,為TRUE只更新圖層參數
feature_extract=True

四、輔助函數

1、模型訓練和驗證

  • train_model函數處理給定模型的訓練和驗證。作為輸入,它需要PyTorch模型、數據加載器字典、損失函數、優化器、用于訓練和驗 證epoch數,以及當模型是初始模型時的布爾標志。
  • is_inception標志用于容納 Inception v3 模型,因為該體系結構使用輔助輸出, 并且整體模型損失涉及輔助輸出和最終輸出,如此處所述。 這個函數訓練指定數量的epoch,并且在每個epoch之后運行完整的驗證步驟。它還跟蹤最佳性能的模型(從驗證準確率方面),并在訓練 結束時返回性能最好的模型。在每個epoch之后,打印訓練和驗證正確率。
?
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
#%%模型訓練和驗證
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)
        # 每個epoch都有一個訓練和驗證階段
        for phase in['train','val']:
            if phase=='train':
                model.train()
            else:
                model.eval()
                
            running_loss=0.0
            running_corrects=0
            # 迭代數據
            for inputs,labels in dataloaders[phase]:
                inputs=inputs.to(device)
                labels=labels.to(device)
                # 梯度置零
                optimizer.zero_grad()
                # 向前傳播
                with torch.set_grad_enabled(phase=='train'):
                    # 獲取模型輸出并計算損失,開始的特殊情況在訓練中他有一個輔助輸出
                    # 在訓練模式下,通過將最終輸出和輔助輸出相加來計算損耗,在測試中值考慮最終輸出
                    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、設置模型參數的'.requires_grad屬性'

當我們進行特征提取時,此輔助函數將模型中參數的 .requires_grad 屬性設置為False。
默認情況下,當我們加載一個預訓練模型時,所有參數都是 .requires_grad = True,如果我們從頭開始訓練或微調,這種設置就沒問題。
但是,如果我們要運行特征提取并且只想為新初始化的層計算梯度,那么我們希望所有其他參數不需要梯度變化。

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

靚仔今天先去跑步了,再不跑來不及了,先更這么多,后續明天繼續~(感謝有人沒有催更!感謝監督!希望繼續監督!)

以上就是深入理解Pytorch微調torchvision模型的詳細內容,更多關于Pytorch torchvision模型的資料請關注服務器之家其它相關文章!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚州精品天堂中文字幕 | 97精品国产高清在线看入口 | 毛片免| 羞羞视频免费入口网站 | 国产一区二区亚洲 | 黄色免费观看网站 | 成年人精品视频 | 久久亚洲成人 | 日韩欧美动作影片 | 久久精品一二三区 | lutube成人福利在线观看 | 亚洲精品欧美二区三区中文字幕 | 亚洲码无人客一区二区三区 | 亚洲精品v天堂中文字幕 | 毛片视频在线免费观看 | 亚洲国产成人久久成人52 | 91超在线 | 国产一区二区三区四区波多野结衣 | 日本黄色免费播放 | 欧美黄色大片免费观看 | 日韩精品dvd| 成年免费在线视频 | 久久精品视频1 | 精品一区二区久久久久 | 国产jjizz一区二区三区视频 | 亚洲精品成人18久久久久 | 国产午夜精品一区二区三区视频 | av成人免费看 | 久久久久久亚洲国产精品 | 国产午夜精品一区二区三区视频 | 最新黄色电影网站 | 成人毛片视频在线播放 | 成人精品免费在线观看 | 欧美精品免费一区二区三区 | 久久精品欧美电影 | 国产午夜亚洲精品 | 做羞羞视频 | 激情小说激情图片激情电影 | 欧美毛片在线观看 | 激情小说另类 | 性欧美videos另类极品 |