国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Pytorch基本概念和使用方法

這篇具有很好參考價(jià)值的文章主要介紹了Pytorch基本概念和使用方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1 Adam及優(yōu)化器optimizer(Adam、SGD等)是如何選用的?

1)Momentum

2)RMSProp

3)Adam

2 Pytorch的使用以及Pytorch在以后學(xué)習(xí)工作中的應(yīng)用場(chǎng)景。

1)Pytorch的使用

2)應(yīng)用場(chǎng)景

3 不同的數(shù)據(jù)、數(shù)據(jù)集加載方式以及加載后各部分的調(diào)用處理方式。如DataLoder的使用、datasets內(nèi)置數(shù)據(jù)集的使用。

4 如何加快訓(xùn)練速度以及減少GPU顯存占用

技巧1:inplace=True

技巧2:with torch.no_grad():

技巧3:forward中的變量命名

技巧4:Dataloader數(shù)據(jù)讀取

技巧5:gradient accumulation


1 Adam及優(yōu)化器optimizer(Adam、SGD等)是如何選用的?

深度學(xué)習(xí)的優(yōu)化算法主要有GD,SGD,Momentum,RMSProp和Adam算法。Adam是一種計(jì)算每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率的方法。相當(dāng)于 RMSprop + Momentum。

在講這個(gè)算法之前說一下移動(dòng)指數(shù)加權(quán)平均。移動(dòng)指數(shù)加權(quán)平均法加權(quán)就是根據(jù)同一個(gè)移動(dòng)段內(nèi)不同時(shí)間的數(shù)據(jù)對(duì)預(yù)測(cè)值的影響程度,分別給予不同的權(quán)數(shù),然后再進(jìn)行平均移動(dòng)以預(yù)測(cè)未來值。假定給定一系列數(shù)據(jù)值Pytorch基本概念和使用方法那么,我們根據(jù)這些數(shù)據(jù)來擬合一條曲線,所得的值Pytorch基本概念和使用方法就是如下的公式:

Pytorch基本概念和使用方法

其中,在上面的公式中,β等于歷史值的加權(quán)率。根據(jù)這個(gè)公式我們可以根據(jù)給定的數(shù)據(jù),擬合出下圖類似的一條比較平滑的曲線。

Pytorch基本概念和使用方法

1)Momentum

通常情況我們?cè)谟?xùn)練深度神經(jīng)網(wǎng)絡(luò)的時(shí)候把數(shù)據(jù)拆解成一小批地進(jìn)行訓(xùn)練,這就是我們常用的mini-batch SGD訓(xùn)練算法,然而雖然這種算法能夠帶來很好的訓(xùn)練速度,但是在到達(dá)最優(yōu)點(diǎn)的時(shí)候并不能夠總是真正到達(dá)最優(yōu)點(diǎn),而是在最優(yōu)點(diǎn)附近徘徊。另一個(gè)缺點(diǎn)就是這種算法需要我們挑選一個(gè)合適的學(xué)習(xí)率,當(dāng)我們采用小的學(xué)習(xí)率的時(shí)候,會(huì)導(dǎo)致網(wǎng)絡(luò)在訓(xùn)練的時(shí)候收斂太慢;當(dāng)我們采用大的學(xué)習(xí)率的時(shí)候,會(huì)導(dǎo)致在訓(xùn)練過程中優(yōu)化的幅度跳過函數(shù)的范圍,也就是可能跳過最優(yōu)點(diǎn)。我們所希望的僅僅是網(wǎng)絡(luò)在優(yōu)化的時(shí)候網(wǎng)絡(luò)的損失函數(shù)有一個(gè)很好的收斂速度同時(shí)又不至于擺動(dòng)幅度太大。

所以 Momentum 優(yōu)化器剛好可以解決我們所面臨的問題,它主要是基于梯度的移動(dòng)指數(shù)加權(quán)平均。假設(shè)在當(dāng)前的迭代步驟第 t 步中,那么基于 Momentum 優(yōu)化算法可以寫成下面的公式:

Pytorch基本概念和使用方法

其中,在上面的公式中vdwvdb分別是損失函數(shù)在前 t-1 輪迭代過程中累積的梯度動(dòng)量,β是梯度累積的一個(gè)指數(shù),這里我們一般設(shè)置值為0.9。所以Momentum優(yōu)化器的主要思想就是利用了類似于移動(dòng)指數(shù)加權(quán)平均的方法來對(duì)網(wǎng)絡(luò)的參數(shù)進(jìn)行平滑處理的,讓梯度的擺動(dòng)幅度變得更小。

dW和db分別是損失函數(shù)反向傳播時(shí)候所求得的梯度,下面兩個(gè)公式是網(wǎng)絡(luò)權(quán)重向量和偏置向量的更新公式,α是網(wǎng)絡(luò)的學(xué)習(xí)率。當(dāng)我們使用Momentum優(yōu)化算法的時(shí)候,可以解決mini-batch SGD優(yōu)化算法更新幅度擺動(dòng)大的問題,同時(shí)可以使得網(wǎng)絡(luò)的收斂速度更快。

2)RMSProp

RMSProp算法的全稱叫 Root Mean Square Prop,是Geoffrey E. Hinton在Coursera課程中提出的一種優(yōu)化算法,在上面的Momentum優(yōu)化算法中,雖然初步解決了優(yōu)化中擺動(dòng)幅度大的問題。所謂的擺動(dòng)幅度就是在優(yōu)化中經(jīng)過更新之后參數(shù)的變化范圍,如下圖所示,藍(lán)色的為Momentum優(yōu)化算法所走的路線,綠色的為RMSProp優(yōu)化算法所走的路線。

Pytorch基本概念和使用方法

為了進(jìn)一步優(yōu)化損失函數(shù)在更新中存在擺動(dòng)幅度過大的問題,并且進(jìn)一步加快函數(shù)的收斂速度,RMSProp算法對(duì)權(quán)重 W 和偏置 b 的梯度使用了微分平方加權(quán)平均數(shù)。 其中,假設(shè)在第 t 輪迭代過程中,各個(gè)公式如下所示:

Pytorch基本概念和使用方法

算法的主要思想就用上面的公式表達(dá)完畢了。在上面的公式中sdw和sdb分別是損失函數(shù)在前 t?1 輪迭代過程中累積的梯度動(dòng)量,β是梯度累積的一個(gè)指數(shù)。所不同的是,RMSProp算法對(duì)梯度計(jì)算了微分平方加權(quán)平均數(shù)。這種做法有利于消除了擺動(dòng)幅度大的方向,用來修正擺動(dòng)幅度,使得各個(gè)維度的擺動(dòng)幅度都較小。另一方面也使得網(wǎng)絡(luò)函數(shù)收斂更快。(比如當(dāng) dW或者 db中有一個(gè)值比較大的時(shí)候,那么我們?cè)诟聶?quán)重或者偏置的時(shí)候除以它之前累積的梯度的平方根,這樣就可以使得更新幅度變?。榱朔乐狗帜笧榱?,使用了一個(gè)很小的數(shù)值Pytorch基本概念和使用方法?來進(jìn)行平滑,一般取值為10的負(fù)八次方。

3)Adam

有了上面兩種優(yōu)化算法,一種可以使用類似于物理中的動(dòng)量來累積梯度,另一種可以使得收斂速度更快同時(shí)使得波動(dòng)的幅度更小。那么將兩種算法結(jié)合起來所取得的表現(xiàn)一定會(huì)更好。Adam(Adaptive Moment Estimation)算法是將Momentum算法和RMSProp算法結(jié)合起來使用的一種算法。

很多論文里都會(huì)用 SGD,沒有 Momentum 等。SGD 雖然能達(dá)到極小值,但是比其他算法用的時(shí)間長(zhǎng),而且可能會(huì)被困在鞍點(diǎn)。

如果需要更快的收斂,或者是訓(xùn)練更深更復(fù)雜的神經(jīng)網(wǎng)絡(luò),需要用一種自適應(yīng)的算法。

整體來講,Adam 是最好的選擇。

2 Pytorch的使用以及Pytorch在以后學(xué)習(xí)工作中的應(yīng)用場(chǎng)景。

1)Pytorch的使用

①安裝pytorch

②使用SpyderPytorch基本概念和使用方法創(chuàng)建一個(gè)project,點(diǎn)擊Projects--->New Project

③在其中輸入project名稱,選擇項(xiàng)目地址就ok了,比如我們創(chuàng)建Handwritten_numeral_recognition(手寫數(shù)字識(shí)別)

Pytorch基本概念和使用方法

Pytorch基本概念和使用方法

④創(chuàng)建一個(gè)module,創(chuàng)建一個(gè)test.py。

Pytorch基本概念和使用方法

Pytorch基本概念和使用方法

⑤輸入import torch,就可以開始pytorch的使用了。

Pytorch基本概念和使用方法

2)應(yīng)用場(chǎng)景

①醫(yī)療

Pytorch基本概念和使用方法
醫(yī)學(xué)圖像分割

基于U-net的醫(yī)學(xué)影像分割

通過Pytorch深度學(xué)習(xí)框架,編寫分割腦部解剖結(jié)構(gòu)程序。

②工業(yè)

比如通過Pytorch深度學(xué)習(xí)框架,編寫設(shè)備的剩余壽命預(yù)測(cè)、故障診斷程序。

3 不同的數(shù)據(jù)、數(shù)據(jù)集加載方式以及加載后各部分的調(diào)用處理方式。如DataLoder的使用、datasets內(nèi)置數(shù)據(jù)集的使用。

- dataloader本質(zhì)是一個(gè)可迭代對(duì)象,使用iter()訪問,不能使用next()訪問;

- 使用iter(dataloader)返回的是一個(gè)迭代器,然后可以使用next訪問;

- 也可以使用`for inputs, labels in dataloaders`進(jìn)行可迭代對(duì)象的訪問;

- 一般我們實(shí)現(xiàn)一個(gè)datasets對(duì)象,傳入到dataloader中;然后內(nèi)部使用yeild返回每一次batch的數(shù)據(jù);

pytorch 的數(shù)據(jù)加載到模型的操作順序是這樣的:

① 創(chuàng)建一個(gè) Dataset 對(duì)象

② 創(chuàng)建一個(gè) DataLoader 對(duì)象

③ 循環(huán)這個(gè) DataLoader 對(duì)象,將img, label加載到模型中進(jìn)行訓(xùn)練

dataset = MyDataset()

dataloader = DataLoader(dataset)

num_epoches = 100

for epoch in range(num_epoches):

????for img, label in dataloader:

????????....

所以,作為直接對(duì)數(shù)據(jù)進(jìn)入模型中的關(guān)鍵一步, DataLoader非常重要。

4 如何加快訓(xùn)練速度以及減少GPU顯存占用

到底什么在占用顯存?

輸入的數(shù)據(jù)占用空間其實(shí)并不大,比如一個(gè)(256, 3, 100, 100)的Tensor(相當(dāng)于batchsize=256的100*100的三通道圖片。)只占用31M顯存。

實(shí)際上,占用顯存的大頭在于:1. 動(dòng)輒上千萬的模型參數(shù);2. 模型中間變量;3. 優(yōu)化器中間參數(shù)。

第一點(diǎn)模型參數(shù)不必介紹;第二點(diǎn),中間變量指每個(gè)語(yǔ)句的輸出。而在backward時(shí),這部分中間變量會(huì)翻倍(因?yàn)樾枰A粼虚g值)。第三點(diǎn),優(yōu)化器在梯度下降時(shí),模型參數(shù)在更新時(shí)會(huì)產(chǎn)生保存中間變量,也就是模型的params在這時(shí)翻倍。

技巧1:inplace=True

一些激活函數(shù)與Dropout有一個(gè)參數(shù)"inplace",默認(rèn)設(shè)置為False,當(dāng)設(shè)置為True時(shí),我們?cè)谕ㄟ^ReLU()計(jì)算時(shí)得到的新值不會(huì)占用新的空間而是直接覆蓋原來的值,這也就是為什么當(dāng)inplace參數(shù)設(shè)置為True時(shí)可以節(jié)省一部分內(nèi)存的緣故。但在某些需要原先的值的情況下,就不可設(shè)置inplace。

此操作相當(dāng)于針對(duì)顯存占用第二點(diǎn)(模型中間變量)的優(yōu)化。

技巧2:with torch.no_grad():

對(duì)于只需要forward而不需要backward的過程(validation和test),使用torch.no_grad做上下文管理器(注意要在model.eval()之后),可以讓測(cè)試時(shí)batchsize擴(kuò)大近十倍,而且也可以加速測(cè)試過程。此操作相當(dāng)于針對(duì)顯存占用第二點(diǎn)(因?yàn)橹苯記]有backward了)和第三點(diǎn)進(jìn)行優(yōu)化。

model.eval()

with torch.no_grad():

pass

技巧3:forward中的變量命名

在研究pytorch官方架構(gòu)和大神的代碼后可發(fā)現(xiàn)大部分的forward都是以x=self.conv(x)的形式,很少引入新的變量,所以啟發(fā)兩點(diǎn)以減少顯存占用(1)把不需要的變量都用x代替,(2)變量用完之后馬上用del刪除(此操作慎用,清除顯存的同時(shí)使得backProp速度變慢)。此操作相當(dāng)于針對(duì)第二點(diǎn)(模型中間變量)進(jìn)行優(yōu)化。

技巧4:Dataloader數(shù)據(jù)讀取

一定要使用pytorch的Dataloader來讀取數(shù)據(jù)。按照以下方式來設(shè)置:

loader = data.Dataloader(PYTORCH_DATASET, num_works=CPU_COUNT,

?????????????????????????pin_memory=True, drop_last=True)

第一個(gè)參數(shù)是用pytorch制作的TensorDataset,第二個(gè)參數(shù)是CPU的數(shù)量(默認(rèn)為0,在真正訓(xùn)練時(shí)建議調(diào)整),第三個(gè)參數(shù)默認(rèn)為False,用來控制是否把數(shù)據(jù)先加載到緩存再加載到GPU,建議設(shè)置為True,第四個(gè)參數(shù)用于扔掉最后一個(gè)batch,使得訓(xùn)練更為穩(wěn)定。

將pin_memory開啟后,在通過dataloader讀取數(shù)據(jù)后將數(shù)據(jù)to進(jìn)GPU時(shí)把non_blocking設(shè)置為True,可以大幅度加快數(shù)據(jù)計(jì)算的速度。

for input_tensor in loader:

????input_tensor.to(gpu, non_blocking=True)

????model.forward(input_tensor)

技巧5:gradient accumulation

梯度積累通過累計(jì)梯度來解決本地顯存不足的問題,即不在每個(gè)batch都更新模型參數(shù),而是每經(jīng)過accumulation steps步后,更新一次模型參數(shù)。相當(dāng)于針對(duì)第三點(diǎn)(n步才更新一次參數(shù))來進(jìn)行優(yōu)化。且由于參數(shù)更新的梯度計(jì)算是算力消耗的一部分,故梯度累計(jì)還可以一定程度上加快訓(xùn)練速度。

loss = model(input_tensor)

loss.backward()

if batch_idx % accumulate_steps == 0:

????optim.step()

????optim.zero_grad()

相當(dāng)于一個(gè)epoch的步數(shù)(step)變少了(一個(gè)step相當(dāng)于參數(shù)更新一次),但單個(gè)step的計(jì)算時(shí)間變長(zhǎng)了(略小于n倍的原來時(shí)間)。文章來源地址http://www.zghlxwxcb.cn/news/detail-466173.html

到了這里,關(guān)于Pytorch基本概念和使用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • PyTorch 之 簡(jiǎn)介、相關(guān)軟件框架、基本使用方法、tensor 的幾種形狀和 autograd 機(jī)制

    PyTorch 之 簡(jiǎn)介、相關(guān)軟件框架、基本使用方法、tensor 的幾種形狀和 autograd 機(jī)制

    本文參加新星計(jì)劃人工智能(Pytorch)賽道:https://bbs.csdn.net/topics/613989052 PyTorch 是一個(gè)基于 Torch 的 Python 開源機(jī)器學(xué)習(xí)庫(kù),用于自然語(yǔ)言處理等應(yīng)用程序。它主要由 Facebook 的人工智能小組開發(fā),不僅能夠?qū)崿F(xiàn)強(qiáng)大的 GPU 加速,同時(shí)還支持動(dòng)態(tài)神經(jīng)網(wǎng)絡(luò),這一點(diǎn)是現(xiàn)在很多主流框架

    2024年01月18日
    瀏覽(24)
  • Pytorch 的基本概念和使用場(chǎng)景介紹

    Pytorch 的基本概念和使用場(chǎng)景介紹

    PyTorch是Facebook人工智能研究院(FAIR)開發(fā)的一個(gè)開源機(jī)器學(xué)習(xí)庫(kù),它使用Python語(yǔ)言編寫,支持動(dòng)態(tài)計(jì)算圖和分布式訓(xùn)練。PyTorch的特點(diǎn)是靈活、易用、高效,并且在研究和實(shí)際應(yīng)用中得到了廣泛的應(yīng)用。 PyTorch將張量作為基本數(shù)據(jù)結(jié)構(gòu),類似于NumPy中的數(shù)組。張量可以是多維數(shù)

    2024年02月10日
    瀏覽(17)
  • JDBC的概念、作用、使用方法等

    JDBC是Java Database Connectivity的縮寫,它是一組用于Java編程語(yǔ)言中連接和操作數(shù)據(jù)庫(kù)的API。JDBC API定義了一組標(biāo)準(zhǔn)接口,使Java應(yīng)用程序能夠與任何關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行交互,如Oracle、MySQL、PostgreSQL、Microsoft SQL Server等。 JDBC的作用是允許Java應(yīng)用程序通過JDBC API與數(shù)據(jù)庫(kù)進(jìn)行通信,以

    2024年02月09日
    瀏覽(21)
  • pytorch中nn.ModuleList()使用方法

    我們可以將我們需要的層放入到一個(gè)集合中,然后將這個(gè)集合作為參數(shù)傳入nn.ModuleList中,但是這個(gè)子類并不可以直接使用,因?yàn)檫@個(gè)子類并沒有實(shí)現(xiàn)forward函數(shù),所以要使用還需要放在繼承了nn.Module的模型中進(jìn)行使用。

    2024年02月07日
    瀏覽(24)
  • pytorch中nn.Parameter()使用方法

    對(duì)于 nn.Parameter() 是pytorch中定義 可學(xué)習(xí)參數(shù) 的一種方法,因?yàn)槲覀冊(cè)诖罱ňW(wǎng)絡(luò)時(shí),網(wǎng)絡(luò)中會(huì)存在一些矩陣,這些矩陣內(nèi)部的參數(shù)是可學(xué)習(xí)的,也就是可梯度求導(dǎo)的。 對(duì)于一些常用的網(wǎng)絡(luò)層,例如 nn.Conv2d()卷積層 、 nn.LInear()線性層 、 nn.LSTM()循環(huán)網(wǎng)絡(luò)層 等,這些網(wǎng)絡(luò)層在pyt

    2024年02月13日
    瀏覽(26)
  • valgrind基本功能介紹、基礎(chǔ)使用方法說明 valgrind基本功能介紹、基礎(chǔ)使用方法說明

    valgrind基本功能介紹、基礎(chǔ)使用方法說明_valgrind使用方法_HNU Latecomer的博客-CSDN博客 拷貝效果不好,請(qǐng)看原文。 1、Valgrind概述 Valgrind是一套Linux下,開放源代碼(GPL V2)的仿真調(diào)試工具的集合。 Valgrind由內(nèi)核(core)以及基于內(nèi)核的其他調(diào)試工具組成。內(nèi)核類似于一個(gè)框架(f

    2024年02月07日
    瀏覽(22)
  • PyTorch中g(shù)rid_sample的使用方法

    PyTorch中g(shù)rid_sample的使用方法

    官方文檔 首先Pytorch中g(shù)rid_sample函數(shù)的接口聲明如下: input : 輸入tensor, shape為 [N, C, H_in, W_in] grid: 一個(gè)field flow, shape為[N, H_out, W_out, 2],最后一個(gè)維度是每個(gè)grid(H_out_i, W_out_i)在input的哪個(gè)位置的鄰域去采點(diǎn)。數(shù)值范圍被歸一化到[-1,1]。 這里的input和output就是輸入的圖片,或

    2024年02月08日
    瀏覽(16)
  • docker基本使用方法

    docker基本使用方法

    Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。Docker 使您能夠?qū)?yīng)用程序與基礎(chǔ)架構(gòu)分開,從而可以快速交付軟件。通過利用 Docker 的方法來快速交付,測(cè)試和部署代碼,您可以大大減

    2024年02月13日
    瀏覽(26)
  • Wireshark基本使用方法

    Wireshark基本使用方法

    目錄 1、Wireshark介紹 1.1?Wireshark使用 1.2?支持的協(xié)議 2.Wireshark主要應(yīng)用 3.Wireshark安裝 ?4.Wireshark頁(yè)面介紹 4.1?分組列表 ?4.2?分組詳情 ?4.3?分組字節(jié)流 ?5.Wireshark導(dǎo)航 5.1?開始捕獲分組 5.2?停止捕獲分組 5.3 重新開始當(dāng)前捕獲 5.4、捕獲選項(xiàng) 5.5?打開以保存的捕獲文件 5.6?保存捕

    2024年02月13日
    瀏覽(20)
  • vim基本使用方法

    vim是linux上一個(gè)有多個(gè)編輯模式的編輯器。 這里主要介紹三種模式: 命令模式(Normal mode) 執(zhí)行命令的模式,主要任務(wù)就是控制光標(biāo)移動(dòng)、復(fù)制和刪除。 插入模式(Insert mode) 可以進(jìn)行文字輸入,編寫代碼模式。 末行/底行模式(last line mode) 文件保存退出,文本替換、列出

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包