自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Pytorch教程:新手的快速指南

人工智能 深度學(xué)習(xí)
今天,我們將幫助了解Pytorch如此流行的是什么,使用Pytorch的一些基礎(chǔ),并幫助您制作第一個計算模型。

Python被確定為數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)的進(jìn)入語言,部分感謝開源ML庫Pytorch。

Pytorch的功能強(qiáng)大的深度神經(jīng)網(wǎng)絡(luò)建筑工具和易用性使其成為數(shù)據(jù)科學(xué)家的熱門選擇。隨著其人氣的發(fā)展,越來越多的公司正在從Tensorflow轉(zhuǎn)移到Pytorch,現(xiàn)在開始使用Pytorch的最佳時間。

今天,我們將幫助了解Pytorch如此流行的是什么,使用Pytorch的一些基礎(chǔ),并幫助您制作第一個計算模型。

[[385724]]

什么是pytorch?

PyTorch是一個開源機(jī)器學(xué)習(xí)Python庫,用于深度學(xué)習(xí)實現(xiàn),如計算機(jī)視覺(使用武器)和自然語言處理。它是由Facebook的AI Research Lab(Fair)于2016年開發(fā)的,自數(shù)據(jù)科學(xué)和ML領(lǐng)域以來已采用。

Pytorch為已經(jīng)熟悉Python的人提供了直觀的機(jī)器,并且具有oop支持和動態(tài)計算圖等具有很大的功能。

除了構(gòu)建深度神經(jīng)網(wǎng)絡(luò)之外,由于其GPU加速,Pytorch也非常適合復(fù)雜的數(shù)學(xué)計算。此功能允許Pytorch使用計算機(jī)的GPU來大量加速計算。

這種獨特的功能和Pytorch的無與倫比的簡單的組合使其成為最受歡迎的深度學(xué)習(xí)庫之一,只有頂點的Tensorflow競爭。

為什么要使用pytorch?

在Pytorch之前,開發(fā)人員使用高級微積分來查找反向傳播錯誤和節(jié)點加權(quán)之間的關(guān)系。更深的神經(jīng)網(wǎng)絡(luò)呼吁越來越復(fù)雜的操作,限制機(jī)器學(xué)習(xí)的規(guī)模和易在性。

現(xiàn)在,我們可以使用ML圖書館自動完成所有的微積分!ML庫可以在幾秒鐘內(nèi)計算任何大小或形狀網(wǎng)絡(luò),允許更多開發(fā)人員構(gòu)建更大和更好的網(wǎng)絡(luò)。

Pytorch通過表現(xiàn)類似于標(biāo)準(zhǔn)Python來進(jìn)一步逐步邁出此訪問。您可以使用現(xiàn)有的Python知識來快速開始啟動現(xiàn)有的Python知識而不是學(xué)習(xí)新的語法。此外,您可以使用Pytorch使用額外的Python庫,例如Pycharm調(diào)試器等流行調(diào)試器。

pytorch與tensorflow.

Pytorch和Tensorflow之間的主要區(qū)別是簡單和性能之間的權(quán)衡:Pytorch更容易學(xué)習(xí)(特別是對于Python程序員),而Tensorflow具有學(xué)習(xí)曲線,但執(zhí)行更好并且更廣泛地使用。

  • 人氣:Tensorflow是行業(yè)專業(yè)人士和研究人員的當(dāng)前轉(zhuǎn)向工具,因為它比Pytorch較早發(fā)布了1年。然而,Pytorch用戶的速度比Tensorflow更快,表明Pytorch可能很快是最受歡迎的。
  • 數(shù)據(jù)并行性:Pytorch包括聲明性數(shù)據(jù)并行性,換句話說,它會自動將數(shù)據(jù)處理的工作量分布在不同的GPU上以加速性能。Tensorflow有并行性,但它要求您手動分配工作,這通常是耗時和更少的效率。
  • 動態(tài)與靜態(tài)圖表:Pytorch默認(rèn)情況下具有動態(tài)圖形,可立即響應(yīng)新數(shù)據(jù)。Tensorflow使用TensoRFlow Fold對動態(tài)圖形的支持有限,但主要使用靜態(tài)圖形。
  • 集成:由于其通過武器密切連接,Pytorch適用于AWS上的項目。Tensorflow與Google Cloud相結(jié)合,并且由于其使用SWIFT API而非常適合移動應(yīng)用程序。
  • 可視化:Tensorflow擁有更強(qiáng)大的可視化工具,并提供更精細(xì)的圖形設(shè)置控制。Pytorch的愿望可視化工具或類似Matplotlib的其他標(biāo)準(zhǔn)繪圖庫并不像Tensorflow那樣完全齊全,但它們更容易學(xué)習(xí)。

pytorch基礎(chǔ)知識

1. 張量

Pytorch Tensors是作為所有高級操作的基礎(chǔ)的多維陣列變量。與標(biāo)準(zhǔn)數(shù)字類型不同,可以分配張量以使用CPU或GPU加速操作。

它們與N維數(shù)量數(shù)量類似,甚至可以僅在單行中轉(zhuǎn)換為Numpy數(shù)組。

張量有5種類型:

  • Floattensor:32位 Float
  • Doubletensor:64位 Float
  • HalfTensor:16位 Float
  • Intstensor:32位int
  • longtensor:64位int

與所有數(shù)字類型一樣,您希望使用適合您需要保存內(nèi)存的最小類型。pytorch使用floattensor作為所有張量的默認(rèn)類型,但您可以使用此使用

  1. torch.set_default_tensor_type(t) 

初始化兩個FloatTensors:

  1. import torch 
  2. # initializing tensors 
  3. a = torch.tensor(2) 
  4. b = torch.tensor(1) 

在簡單的數(shù)學(xué)運算中可以像其他數(shù)字類型一樣使用張量。

  1. # addition 
  2. print(a+b) 
  3. # subtraction 
  4. print(b-a) 
  5. # multiplication 
  6. print(a*b) 
  7. # division 
  8. print(a/b) 

您還可以使用移動GPU的CUDA處理張量。

  1. if torch.cuda.is_available(): 
  2.     xx = x.cuda() 
  3.     yy = y.cuda() 
  4.     x + y 

隨著張量在Pytorch中的矩陣,您可以設(shè)置Tensors以表示數(shù)字表:

  1. ones_tensor = torch.ones((2, 2)) # tensor containing all ones 
  2. rand_tensor = torch.rand((2, 2)) # tensor containing random values 

在這里,我們指定了我們的張量應(yīng)該是2x2平方。在使用rand()函數(shù)時使用vone()函數(shù)或隨機(jī)數(shù)時,填充了廣場。

2. 神經(jīng)網(wǎng)絡(luò)

由于其卓越的分類模型(如圖像分類或卷積神經(jīng)網(wǎng)絡(luò)(CNN)),Pytorch通常用于構(gòu)建神經(jīng)網(wǎng)絡(luò)。

神經(jīng)網(wǎng)絡(luò)是連接和加權(quán)數(shù)據(jù)節(jié)點的層。每個圖層允許模型在其中分類輸入數(shù)據(jù)最匹配的分類。

神經(jīng)網(wǎng)絡(luò)僅與他們的培訓(xùn)一樣好,因此需要大數(shù)據(jù)集和GAN框架,這基于已經(jīng)由模型掌握的那些產(chǎn)生更具挑戰(zhàn)性的培訓(xùn)數(shù)據(jù)。

Pytorch使用Torch.NN包定義神經(jīng)網(wǎng)絡(luò),其中包含一組模塊來表示網(wǎng)絡(luò)的每層。

每個模塊接收輸入張量并計算輸出張力,該輸出張量在一起以創(chuàng)建網(wǎng)絡(luò)。Torch.nn封裝還定義了我們用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的損耗函數(shù)。建立神經(jīng)網(wǎng)絡(luò)的步驟是:

  • 架構(gòu):創(chuàng)建神經(jīng)網(wǎng)絡(luò)層,設(shè)置參數(shù),建立權(quán)重和偏見。
  • 正向傳播:使用參數(shù)計算預(yù)測的輸出。通過比較預(yù)測和實際輸出來測量誤差。
  • 反向傳播:在找到錯誤后,在神經(jīng)網(wǎng)絡(luò)的參數(shù)方面采用錯誤功能的導(dǎo)數(shù)。向后傳播允許我們更新我們的權(quán)重參數(shù)。
  • 迭代優(yōu)化:使用優(yōu)化器通過使用梯度下降來使用迭代更新參數(shù)的優(yōu)化器來最小化錯誤。

這是Pytorch中神經(jīng)網(wǎng)絡(luò)的示例:

  1. import torch 
  2. import torch.nn as nn 
  3. import torch.nn.functional as F 
  4. class Net(nn.Module): 
  5.     def __init__(self): 
  6.         super(Net, self).__init__() 
  7.         # 1 input image channel, 6 output channels, 3x3 square convolution 
  8.         # kernel 
  9.         self.conv1 = nn.Conv2d(1, 6, 3) 
  10.         self.conv2 = nn.Conv2d(6, 16, 3) 
  11.         # an affine operation: y = Wx + b 
  12.         self.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimension 
  13.         self.fc2 = nn.Linear(120, 84) 
  14.         self.fc3 = nn.Linear(84, 10) 
  15.     def forward(self, x): 
  16.         # Max pooling over a (2, 2) window 
  17.         x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) 
  18.         # If the size is a square you can only specify a single number 
  19.         x = F.max_pool2d(F.relu(self.conv2(x)), 2) 
  20.         xx = x.view(-1, self.num_flat_features(x)) 
  21.         x = F.relu(self.fc1(x)) 
  22.         x = F.relu(self.fc2(x)) 
  23.         x = self.fc3(x) 
  24.         return x 
  25.     def num_flat_features(self, x): 
  26.         size = x.size()[1:]  # all dimensions except the batch dimension 
  27.         num_features = 1 
  28.         for s in size: 
  29.             num_features *= s 
  30.         return num_features 
  31. net = Net() 
  32. print(net) 

NN.Module指定這將是一個神經(jīng)網(wǎng)絡(luò),然后我們用2個Conv2D層定義它,該層執(zhí)行2D卷積,以及執(zhí)行線性變換的3個線性層。

接下來,我們定義了向前概述轉(zhuǎn)發(fā)傳播的前向方法。我們不需要定義向后傳播方法,因為Pytorch默認(rèn)包括向后()功能。

別擔(dān)心現(xiàn)在似乎令人困惑,我們將在本教程后面介紹更簡單的Pytorch實現(xiàn)。

3. Autograd

Autograd是一個用于計算神經(jīng)網(wǎng)絡(luò)操作所必需的衍生產(chǎn)品的Pytorch包。這些衍生物稱為梯度。在轉(zhuǎn)發(fā)通行證期間,Autograd在梯度的張量上記錄所有操作,并創(chuàng)建一個非循環(huán)圖,以找到張量和所有操作之間的關(guān)系。此操作集合稱為自動差異化。

該圖的葉子是輸入張量,根部是輸出張量。Autograd通過將圖形從根到葉子跟蹤并將每個梯度乘以使用鏈規(guī)則來計算漸變來計算梯度。

在計算梯度之后,衍生物的值被自動填充為張量的grad屬性。

  1. import torch 
  2. # pytorch tensor 
  3. x = torch.tensor(3.5, requires_grad=True
  4. # y is defined as a function of x 
  5. y = (x-1) * (x-2) * (x-3) 
  6. # work out gradients 
  7. y.backward() 

默認(rèn)情況下,RESCEL_GRAD設(shè)置為FALSE,PyTorch不會跟蹤漸變。在初始化期間指定RESECT_GRAD為TRUE將使您在執(zhí)行某些操作的情況下對該特定張量進(jìn)行PYTORCH跟蹤梯度。

此代碼查看Y并看到它來自(x-1)(x-2)(x-3),并自動制造梯度dy / dx,3x ^ 2 - 12x + 11

該指令還解決了該梯度的數(shù)值,并將其放置在張量x內(nèi),同時x,3.5的實際值。

漸變?yōu)? (3.5 3.5) - 12 *(3.5)+ 11 = 5.75。

> Image Source: Author

漸變默認(rèn)累計,如果未重置,則可能會影響結(jié)果。使用Model.zero_grad()在每個漸變后重新歸零您的圖形。

4. 優(yōu)化器

優(yōu)化器允許您在模型中更新權(quán)重和偏置以減少錯誤。這允許您編輯模型的工作原理,而無需重新制止整個事物。

所有Pytorch優(yōu)化器都包含在Torch.optim包中,每個優(yōu)化方案都設(shè)計用于特定情況。Torch.optim模塊允許您通過剛剛傳遞參數(shù)列表來構(gòu)建抽象優(yōu)化方案。Pytorch有許多優(yōu)化器可以選擇,這意味著幾乎總是一個最適合您的需求。

例如,我們可以實現(xiàn)公共優(yōu)化算法,SGD(隨機(jī)梯度下降),以平滑我們的數(shù)據(jù)。

  1. import torch.optim as optim 
  2. params = torch.tensor([1.0, 0.0], requires_grad=True
  3. learning_rate = 1e-3 
  4. ## SGD 
  5. optimoptimizer = optim.SGD([params], lr=learning_rate

更新模型后,使用優(yōu)化器.step()告訴Pytorch來重新計算模型。使用優(yōu)化器,我們需要使用循環(huán)手動更新模型參數(shù):

  1. for params in model.parameters():  
  2.        params -params.grad * learning_rate 

總的來說,優(yōu)化器通過允許您優(yōu)化數(shù)據(jù)加權(quán)并改變模型而無需重新制定若需時間來節(jié)省大量時間。

5. 使用pytorch計算圖

為了更好地了解Pytorch和神經(jīng)網(wǎng)絡(luò),可以使用計算圖來練習(xí)。這些圖形本質(zhì)上是一種簡化版本的神經(jīng)網(wǎng)絡(luò),用于有一系列操作,用于了解系統(tǒng)的輸出如何受輸入的影響。

換句話說,輸入x用于找到y(tǒng),然后用于找到輸出z。

> Image Source: Author

想象一下,Y和Z計算如下:

  • y = x ^ 2
  • z = 2Y + 3

但是,我們對輸出Z如何使用Input X進(jìn)行更改感興趣,因此我們需要執(zhí)行一些微積分:

  • dz / dx =(dz / dy)*(dy / dx)
  • dz / dx = 2.2x
  • dz / dx = 4x

使用此,我們可以看到輸入x = 3.5將使z = 14。

知道如何在其他情況下定義每個張量(根據(jù)x,z的y和z,y等方面等)允許pytorch構(gòu)建這些張量如何連接的圖像。

> Image Source: Author

這張照片稱為計算圖,可以幫助我們了解Pytorch如何在幕后工作。

使用此圖形,我們可以看到每個張量如何受到任何其他張量的變化的影響。這些關(guān)系是梯度,用于在訓(xùn)練期間更新神經(jīng)網(wǎng)絡(luò)。

這些圖更容易使用Pytorch比手工操作更容易,所以我們現(xiàn)在試試吧,我們了解幕后發(fā)生的事情。

  1. import torch 
  2. # set up simple graph relating x, y and z 
  3. x = torch.tensor(3.5, requires_grad=True
  4. y = x*x 
  5. z = 2*y + 3 
  6. print("x: ", x) 
  7. print("y = x*x: ", y) 
  8. print("z2*y + 3: ", z) 
  9. # work out gradients 
  10. z.backward() 
  11. print("Working out gradients dz/dx") 
  12. # what is gradient at x = 3.5 
  13. print("Gradient at x = 3.5: ", x.grad) 

這發(fā)現(xiàn)Z = 14就像我們用手發(fā)現(xiàn)的那樣!

6. 與Pytorch的實踐:多路徑計算圖

既然你已經(jīng)看到了一個具有單一關(guān)系的計算圖,讓我們嘗試一個更復(fù)雜的例子。

首先,定義兩個張量,a和b,以用作我們的輸入。確保設(shè)置RESECT_GRAD = TRUE,以便我們可以將漸變縮小到下線。

  1. import torch 
  2. # set up simple graph relating x, y and z 
  3. a = torch.tensor(3.0, requires_grad=True
  4. b = torch.tensor(2.0, requires_grad=True

接下來,設(shè)置我們的輸入和我們神經(jīng)網(wǎng)絡(luò)的每層之間的關(guān)系,x,y和z。請注意,z在x和y方面定義,而x和y使用我們的輸入值a和b定義。

  1. import torch 
  2. # set up simple graph relating x, y and z 
  3. a = torch.tensor(3.0, requires_grad=True
  4. b = torch.tensor(2.0, requires_grad=True
  5. x = 2*a + 3*b 
  6. y = 5*a*a + 3*b*b*b 
  7. z = 2*x + 3*y 

這構(gòu)建了一個關(guān)系鏈,Pytorch可以遵循了解數(shù)據(jù)之間的所有關(guān)系。

我們現(xiàn)在可以通過從z向a追隨z到a的路徑來解決梯度Dz / da。

有兩條路徑,一個通過x和另一條通過y。您應(yīng)該遵循它們并將兩條路徑的表達(dá)式添加在一起。這是有道理的,因為來自a到z的兩條路徑有助于z的值。

如果我們使用Chain規(guī)則的微積分法定了DZ / DA,我們已經(jīng)找到了相同的結(jié)果。

> Image Source: Author

第一路徑X給我們2 * 2,第二條路徑通過Y給我們3 * 10A。因此,Z隨著4 + 30A而變化的速率。

如果A是22,則DZ / DA為4 + 30 * 2 = 64。

我們可以通過從z添加向后傳播然后詢問a的梯度(或衍生)來確認(rèn)它。

  1. import torch 
  2. # set up simple graph relating x, y and z 
  3. a = torch.tensor(2.0, requires_grad=True
  4. b = torch.tensor(1.0, requires_grad=True
  5. x = 2*a + 3*b 
  6. y = 5*a*a + 3*b*b*b 
  7. z = 2*x + 3*y 
  8. print("a: ", a) 
  9. print("b: ", b) 
  10. print("x: ", x) 
  11. print("y: ", y) 
  12. print("z: ", z) 
  13. # work out gradients 
  14. z.backward() 
  15. print("Working out gradient dz/da") 
  16. # what is gradient at a = 2.0 
  17. print("Gradient at a=2.0:", a.grad) 

你學(xué)習(xí)的下一步

恭喜,您現(xiàn)在已完成您的快速入門,并且是Pytorch和神經(jīng)網(wǎng)絡(luò)。完成計算圖形是了解深度學(xué)習(xí)網(wǎng)絡(luò)的重要組成部分。

當(dāng)您了解高級深度學(xué)習(xí)技能和應(yīng)用程序時,您將想要探索:

  • 復(fù)雜的神經(jīng)網(wǎng)絡(luò),優(yōu)化
  • 可視化設(shè)計
  • 用GAN訓(xùn)練

快樂學(xué)習(xí)!

原文鏈接:https://ai.plainenglish.io/pytorch-tutorial-a-quick-guide-for-new-learners-180957cb7214

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2010-05-12 17:41:11

Subversion教

2024-06-19 10:14:59

2010-08-02 09:36:22

Flex

2022-05-16 15:37:32

開源軟件

2023-10-08 18:07:42

Kubernetes開源容器

2020-05-18 09:44:08

PyTorch計算機(jī)視覺深度學(xué)習(xí)

2022-04-08 12:56:52

Linux終端命令

2010-06-07 16:10:53

HadoopOnDem

2025-01-13 07:15:00

Monorepo代碼倉庫中項目代碼管理

2011-05-26 10:45:04

2015-06-12 09:24:35

JavaScript免費教程資源

2020-01-08 11:04:27

混合云云計算私有云

2011-03-30 14:07:56

Ubuntu的安裝

2010-06-21 12:39:56

OSPF路由協(xié)議

2023-03-01 08:00:00

機(jī)器學(xué)習(xí)數(shù)據(jù)集

2010-09-09 13:40:19

XML DOM

2010-07-29 17:11:03

Flex

2010-08-16 15:04:00

DIV入門

2009-11-16 08:58:43

PHP語言

2010-05-27 10:42:38

SVN配置文檔
點贊
收藏

51CTO技術(shù)棧公眾號