ubuntu安裝anaconda,ubuntu使用pytorch訓練出現killed_目標檢測之pytorch預訓練模型的使用(削減削減網絡層,修改參數)fin

 2023-12-25 阅读 27 评论 0

摘要:利用深度學習的方法進行圖像分類及目標檢測時,由于自己數據集可能相對較小,直接利用自己的數據集進行網絡的訓練,非常容易過擬合。在遷移學習中,我們首先在一個基礎數據集和基礎任務上訓練一個基礎網絡,然后我們再微調一下學到的特征ÿ

利用深度學習的方法進行圖像分類及目標檢測時,由于自己數據集可能相對較小,直接利用自己的數據集進行網絡的訓練,非常容易過擬合。在遷移學習中,我們首先在一個基礎數據集和基礎任務上訓練一個基礎網絡,然后我們再微調一下學到的特征,或者說將它們遷移到第二個目標網絡中,用目標數據集和目標任務訓練網絡。

對于計算機視覺領域的圖像特征提取的基礎卷積網絡backbone往往采用在ImageNet數據集上訓練得到的預訓練模型,在torchvision中存儲了基礎常用的基礎網絡的網絡結構及預訓練參數,例如VGG,inception,resnet,densenet,shufflenet,squeezenet等,可以直接調用,但是在目標檢測中,我們往往僅僅使用這些網絡的一些底部的層,上邊的一些卷積層需要根據自己依據實際問題設計;或者在圖像分類中,結果輸出的類別往往不會正好與給定的相同,因而都需要對原始網絡及參數進行修改

torchvision的預訓練模型地址?github.com

1、pytorch中的預訓練模型

在上邊的連接地址中有各個基礎網絡模型的程序源碼,還有預訓練模型參數文件的下載地址,使用時主要采用下邊代碼塊中的文件直接引用

import torchvision.models as models#resnet
model = models.resnet50(pretrained=True)#vgg
model = models.vgg16(pretrained=True)

2、預訓練模型的修改

ubuntu安裝anaconda?在實際的應用中,往往不能直接應用導出的網絡模型,均需要對網絡的模型進行一定的修改才能使用,例如在圖像分類任務中,我們任務的分類數目不一定剛好與imagenet數據集模型類別一致(1000類),在使用時就需要自己對模型參數進行修改(或者直接修改最后一層,然后自己建立合適的層進行自己算法的分類操作)。

在目標檢測中往往自己需要建立特征提取的基礎網絡,需要有選擇的建立適合自己特定需求的網絡,然后利用與預訓練模型結構相同的部分進行初始化,加快模型的收斂速度。

1)參數的修改(分類網絡最后一層參數)

以自己的分類數據集10類為例,直接傳入入類別數目這一參數

# -*- coding:utf-8 -*-
import torchvision.models as models#調用模型
model = models.resnet50(pretrained=True,num_classes = 10)
print(model)

將最后一層fc的參數直接進行修改,對類的屬性進行直接修改,替換掉fc這一層:

# -*- coding:utf-8 -*-
import torchvision.models as models#調用模型
model = models.resnet50(pretrained=True)
#提取fc層中固定的參數(這一層的輸入節點數目
fc_features = model.fc.in_features
#修改類別為9,(直接對類的屬性進行修改)
model.fc = nn.Linear(fc_features, 10)

2)增減卷積層

torch。對于前一種方法,僅適用于在分類問題時對簡單層進行修改,但是對于目標檢測想要利用預訓練模型進行fine-tune該怎么辦呢?這就要學會利用增減卷積層進行預訓練模型的使用了。這兩天剛好需要 修改一個基礎特征提取的網絡結構,但是自己的數據集又太小,直接修改網絡從頭訓練容易出現過擬合,必須使用預訓練的網絡模型進行訓練,就研究了一下使用方法,總結如下:

基本思想就是:先建立好自己的網絡(與預訓練的模型類似,要不談何fine-tune),然后將

削減卷積層

基本思想就是:

pytorch。 1、先建立好自己的網絡(與預訓練的模型類似,要不談何fine-tune)

2、然后將預訓練模型參數與自己搭建的網絡不一致的部分參數去掉

3、將保留的合適的參數讀入網絡初始化,實現fine-tune的效果

基礎網絡準備使用resnet152的前143層(為什么是143,這里直接去掉了最后一個殘差塊)

# -*- coding:utf-8 -*-
#####################
#建立自己的網絡模型net
########################然后讀出預訓練模型參數以resnet152為例,我不是利用程序下載的,我是習慣了下載好存儲在文件夾中
pretrained_dict = torch.load(save_path)
model_dict = net.state_dict()   (讀出搭建的網絡的參數,以便后邊更新之后初始化)####去除不屬于model_dict的鍵值
pretrained_dict={ k : v for k, v in pretrained_dict.items() if k in model_dict}###更新現有的model_dict的值
model_dict.update(pretrained_dict)##加載模型需要的參數
net.load_state_dict(model_dict)

ubuntu,介紹到這兒,相信應該對模型讀入參數的方法load_state_dict()有了清晰的了解,就是利用鍵值的對應關系讀入參數進行初始化網絡,鍵值不對應會報錯

知道了如何讀入參數,那么增加卷積層的操作應該已經能夠理解了。

增加卷積層

上邊介紹了削減卷積層,那么如果我想在后邊累加一些卷積層怎么辦呢,這個更簡單了,直接對應將前邊的卷積層參數利用預訓練模型初始化,后邊添加的卷積層利用nn.init.kaiming_normal_進行初始化

#torch.nn.init.uniform_(tensor, a=0, b=1)
#從均勻分布U(a, b)中生成值,填充輸入的張量或變量
#參數:
#tensor - n維的torch.Tensor
#a - 均勻分布的下界
#b - 均勻分布的上界
#例子
w = torch.Tensor(3, 5)
nn.init.uniform_(w)#torch.nn.init.normal_(tensor, mean=0, std=1)
#從給定均值和標準差的正態分布N(mean, std)中生成值,填充輸入的張量或變量
#參數:
#tensor – n維的torch.Tensor
#mean – 正態分布的均值
#std – 正態分布的標準差
#例子
w = torch.Tensor(3, 5)
nn.init.normal_(w)#torch.nn.init.constant(tensor, val)
#用val的值填充輸入的張量或變量#torch.nn.init.eye_(tensor)
#用單位矩陣來填充2維輸入張量或變量。在線性層盡可能多的保存輸入特性#####################################這個用的比較多
#torch.nn.init.xavier_uniform_(tensor, gain=1)
#根據Glorot, X.和Bengio, Y.在“Understanding the difficulty of training deep feedforward neural networks”中描述的方法,用一個均勻分布生成值,填充輸入的張量或變量。結果張量中的值采樣自U(-a, a),其中a= gain * sqrt( 2/(fan_in + fan_out))* sqrt(3). 該方法也被稱為Glorot initialisation
#參數:
#tensor – n維的torch.Tensor
#gain - 可選的縮放因子
#例子:w = torch.Tensor(3, 5)nn.init.xavier_uniform_(w, gain=math.sqrt(2.0))#torch.nn.init.xavier_normal_(tensor, gain=1)
#根據Glorot, X.和Bengio, Y. 于2010年在“Understanding the difficulty of training deep feedforward neural networks”中描述的方法,用一個正態分布生成值,填充輸入的張量或變量。結果張量中的值采樣自均值為0,標準差為gain * sqrt(2/(fan_in + fan_out))的正態分布。也被稱為Glorot initialisation#torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in')
#根據He, K等人于2015年在“Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification”中描述的方法,用一個均勻分布生成值,填充輸入的張量或變量。結果張量中的值采樣自U(-bound, bound),其中bound = sqrt(2/((1 + a^2) * fan_in)) * sqrt(3)。也被稱為He initialisation.
#tensor – n維的torch.Tensor或autograd.Variable
#a -這層之后使用的rectifier的斜率系數(ReLU的默認值為0)
#mode -可以為“fan_in”(默認)或“fan_out”。“fan_in”保留前向傳播時權值方差的量級,“fan_out”保留反向傳播時的量級。.
################################這個用的較多
#torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in')
#根據He, K等人在“Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification”中描述的方法,用一個正態分布生成值,填充輸入的張量或變量。結果張量中的值采樣自均值為0,標準差為sqrt(2/((1 + a^2) * fan_in))的正態分布。#tensor – n維的torch.Tensor或 autograd.Variable
#a -這層之后使用的rectifier的斜率系數(ReLU的默認值為0)
#mode -可以為“fan_in”(默認)或“fan_out”。“fan_in”保留前向傳播時權值方差的量級,“fan_out”保留反向傳播時的量級。

pytorch model.train?在中間插入卷積層呢,又該怎么辦呢?

利用state-dict的鍵值對應讀入原始的參數,新添加的層利用合適的方式直接初始化就可以。

總之,增加卷積層的操作,就是將原有的卷積層參數按照對應的鍵值讀入,將新添加的層利用nn.init.kaiming_normal_進行初始化就可以

看到這兒,應該已經可以利用torchvision的預訓練模型輕松的進行fine-tune了。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/194612.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息