【深度學習】深度學習之Pytorch基礎教程!

2021-03-02 機器學習初學者

作者:李祖賢,Datawhale高校群成員,深圳大學隨著深度學習的發展,深度學習框架開始大量的出現。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支持一些開源的深度學習框架。目前研究人員正在使用的深度學習框架不盡相同,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。這其中,TensorFlow和Pytorch佔據了深度學習的半壁江山。前幾天分享了TensorFlow的基本教程後,很多人在後臺留言說能不能寫寫Pytorch入門。本著粉絲的訴求必須滿足的原則,熬夜幹,有了今天的文章。所以你懂我意思吧,記得轉發、點讚、在看三聯。本文結合Pytorch官方教程、邱錫鵬老師的《神經網絡與深度學習》和李沐老師的《動手學深度學習》,為大家介紹的一下Pytorch深度學習框架。具體目錄如下:一、數據操作
# 創建未初始化的Tensorx = torch.empty(5,3)print(x)

x = torch.rand(5,3)print(x)

x = torch.zeros(5,3,dtype=torch.long)print(x)

# 根據數據創建Tensorx = torch.tensor([5.5,3])print(x)

# 修改原Tensor為全1的Tensorx = x.new_ones(5,3,dtype=torch.float64)print(x)
# 修改數據類型x = torch.rand_like(x,dtype=torch.float64)print(x)

print(x.size())print(x.shape)


這些創建方法都可以在創建的時候指定數據類型dtype和存放device(cpu/gpu)。

1.2.1 算術操作

在PyTorch中,同⼀種操作可能有很多種形式,下⾯面⽤用加法作為例子。

# 形式1:y = torch.rand(5,3)print(x+y)

# 形式2print(torch.add(x,y))# 還可以指定輸出result = torch.empty(5, 3)torch.add(x, y, out=result)print(result)

我們還可以使⽤類似NumPy的索引操作來訪問 Tensor 的一部分,需要注意的是:索引出來的結果與原數據共享內存,也即修改⼀個,另⼀個會跟著修改。

y = x[0,:]y += 1print(y)print(x[0,:])  # 觀察x是否改變了

1.2.3 改變形狀

注意 view() 返回的新tensor與源tensor共享內存(其實是同⼀個tensor),也即更改其中的⼀個,另 外⼀個也會跟著改變。(顧名思義,view僅是改變了對這個張量的觀察角度)

y = x.view(15)z = x.view(-1,5) print(x.size(),y.size(),z.size())

所以如果我們想返回⼀個真正新的副本(即不共享內存)該怎麼辦呢?Pytorch還提供了⼀ 個 reshape() 可以改變形狀,但是此函數並不能保證返回的是其拷貝,所以不推薦使用。推薦先 ⽤ clone 創造一個副本然後再使⽤ view 。

x_cp = x.clone().view(15)x -= 1print(x)print(x_cp)

另外⼀個常用的函數就是 item() , 它可以將⼀個標量 Tensor 轉換成⼀個Python

number:x = torch.randn(1)print(x)print(x.item())


1.2.4 線性代數

官方文檔:https://pytorch.org/docs/stable/torch.html

1.3 廣播機制

前⾯我們看到如何對兩個形狀相同的 Tensor 做按元素運算。當對兩個形狀不同的 Tensor 按元素運算時,可能會觸發廣播(broadcasting)機制:先適當複製元素使這兩個 Tensor 形狀相同後再按元素運算。例如:

x = torch.arange(1,3).view(1,2)print(x)y = torch.arange(1,4).view(3,1)print(y)print(x+y)

1.4 Tensor和Numpy相互轉化

我們很容易⽤ numpy() 和 from_numpy() 將 Tensor 和NumPy中的數組相互轉換。但是需要注意的⼀點是:這兩個函數所產生的的 Tensor 和NumPy中的數組共享相同的內存(所以他們之間的轉換很快),改變其中⼀個時另⼀個也會改變!!!

a = torch.ones(5)b = a.numpy()print(a,b)

使⽤ from_numpy() 將NumPy數組轉換成 Tensor :

import numpy as npa = np.ones(5)b = torch.from_numpy(a)print(a,b)

a += 1print(a,b)b += 1print(a,b)

1.5 GPU運算

# let us run this cell only if CUDA is available# We will use ``torch.device`` objects to move tensors in and out of GPUif torch.cuda.is_available():    device = torch.device("cuda")          # a CUDA device object    y = torch.ones_like(x, device=device)  # directly create a tensor on GPU    x = x.to(device)                       # or just use strings ``.to("cuda")``    z = x + y    print(z)    print(z.to("cpu", torch.double))       # ``.to`` can also change dtype together!

二、自動求梯度(非常重要)
很多人看到這裡是懵的,因為為什麼會得出導數的結果,在這裡我給出自動求導的一些原理性的知識,希望能幫助大家更好的學習pytorch這個重要的框架。該autograd軟體包是PyTorch中所有神經網絡的核心。讓我們首先簡要地訪問它,然後我們將去訓練我們的第一個神經網絡。該autograd軟體包可自動區分張量上的所有操作。這是一個按運行定義的框架,這意味著您的backprop是由代碼的運行方式定義的,並且每次迭代都可以不同。如果想了解數值微分數值積分和自動求導的知識,可以查看邱錫鵬老師的《神經網絡與深度學習》第四章第五節:下載地址:https://nndl.github.io/

  

在  處的導數。我們的做法是利用鏈式法則分解為一系列的操作:

2.1 張量及張量的求導(Tensor)

# 加入requires_grad=True參數可追蹤函數求導x = torch.ones(2,2,requires_grad=True)print(x)print(x.grad_fn)

# 進行運算y = x + 2print(y)print(y.grad_fn)  # 創建了一個加法操作<AddBackward0 object at 0x0000017AF2F86EF0>

像x這種直接創建的稱為葉子節點,葉子節點對應的 grad_fn 是 None 。

print(x.is_leaf,y.is_leaf)

z = y * y * 3out = z.mean()print(z,out)

.requires_grad_( ... )改變requires_grad 的屬性。
a = torch.randn(2,2)    # 缺失情況下默認 requires_grad = Falsea = ((a*3)/(a-1))print(a.requires_grad)  # Falsea.requires_grad_(True)print(a.requires_grad)b = (a*a).sum()print(b.grad_fn)

現在讓我們反向傳播:因為out包含單個標量,out.backward()所以等效於out.backward(torch.tensor(1.))。

out.backward()print(x.grad)

out2 = x.sum()out2.backward()print(x.grad)
out3 = x.sum()x.grad.data.zero_()out3.backward()print(x.grad)

三、神經網絡設計的pytorch版本這是一個簡單的前饋網絡。它獲取輸入,將其一層又一層地饋入,然後最終給出輸出。神經網絡的典型訓練過程如下:

3.1 定義網絡

import torchimport torch.nn as nnimport torch.nn.functional as F
class Net(nn.Module):
def __init__(self): super(Net,self).__init__() # 1 input image channel, 6 output channels, 3x3 square convolution # kernel self.conv1 = nn.Conv2d(1,6,3) self.conv2 = nn.Conv2d(6,16,3) # an affine operation: y = Wx + b self.fc1 = nn.Linear(16*6*6,120) # 6*6 from image dimension self.fc2 = nn.Linear(120,84) self.fc3 = nn.Linear(84,10)
def forward(self,x): # Max pooling over a (2, 2) window x = F.max_pool2d(F.relu(self.conv1(x)),(2,2)) # CLASStorch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False) x = F.max_pool2d(F.relu(self.conv2(x)),2) x = x.view(-1,self.num_flat_features(x)) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x
def num_flat_features(self,x): size = x.size()[1:] # all dimensions except the batch dimension num_features = 1 for s in size: num_features *= s print(num_features) return num_features
net = Net()print(net)

# 模型的可學習參數由返回 net.parameters()params = list(net.parameters())print(len(params))print(params[0].size())  # conv1's .weight

# 嘗試一個32x32隨機輸入input = torch.randn(1,1,32,32)out = net(input)print(out)

# 用隨機梯度將所有參數和反向傳播器的梯度緩衝區歸零:net.zero_grad()out.backward(torch.randn(1,10))

output = net(input)target = torch.randn(10)    # a dummy target, for exampletarget = target.view(-1,1)  # # make it the same shape as outputcriterion = nn.MSELoss()
loss = criterion(output,target)print(loss)

我們現在的網絡結構:

# 如果loss使用.grad_fn屬性的屬性向後移動,可查看網絡結構print(loss.grad_fn)  # MSELossprint(loss.grad_fn.next_functions[0][0])  # Linearprint(loss.grad_fn.next_functions[0][0].next_functions[0][0])  # ReLU

實踐中使用的最簡單的更新規則是隨機梯度下降(SGD):

weight = weight - learning_rate * gradient

import torch.optim as optim
optimizer = optim.SGD(net.parameters(),lr = 0.01)
optimizer.zero_grad() output = net(input)loss = criterion(output,target)loss.backward()optimizer.step()

576

四、寫到最後

今天,要講的Pytorch基礎教程到這裡就結束了,相信大家通過上邊的學習已經對Pytorch基礎教程有了初步的了解。

關於Pytorch的項目實踐,阿里天池「零基礎入門NLP」學習賽中提供了Pytorch版實踐教程,供學習參考(閱讀原文直接跳轉):

https://tianchi.aliyun.com/competition/entrance/531810/forum

獲取一折本站知識星球優惠券,複製連結直接打開:

https://t.zsxq.com/yFQV7am

本站qq群1003271085。

加入微信群請掃碼進群:

相關焦點

  • 深度學習之Pytorch基礎教程!
    ,深度學習框架開始大量的出現。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興項目,他們也一直在支持一些開源的深度學習框架。目前研究人員正在使用的深度學習框架不盡相同,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。這其中,TensorFlow和Pytorch佔據了深度學習的半壁江山。
  • 深度學習框架搭建之PyTorch
    深度學習框架搭建之PyTorchPyTorch 簡介PyTorch 是由 Facebook 推出,目前一款發展與流行勢頭非常強勁的深度學習框架。PyTorch 與 NumPy 非常相似,可以說是它的替代者,支持 GPU 加速運算,用來搭建和訓練深度神經網絡。如果學習過 NumPy 以及常見的深度學習概念(如卷積層,循環層等),非常容易上手PyTorch。目前主流的深度學習框架主要有 TensorFlow,PyTorch,mxnet,caffe和Keras 等。
  • 深度學習大講堂之pytorch入門
    ,他們也一直在支持一些開源的深度學習框架,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。這其中,TensorFlow和Pytorch佔據了深度學習的半壁江山。今天小天就帶大家從數據操作、自動求梯度和神經網絡設計的pytorch版本三個方面來入門pytorch。
  • PyTorch  深度學習新手入門指南
    ,這篇文章是為想開始用pytorch來進行深度學習項目研究的人準備的。如果在領英上,你也許會說自己是一個深度學習的狂熱愛好者,但是你只會用 keras 搭建模型,那麼,這篇文章非常適合你。2. 你可能對理解 tensorflow 中的會話,變量和類等有困擾,並且計劃轉向 pytorch,很好,你來對地方了。3. 如果你能夠用 pytorch 構建重要、複雜的模型,並且現在正在找尋一些實現細節,不好意思,你可以直接跳到最後一部分。
  • 最全面的深度學習框架pytorch搭建過程
    深度學習一直是比較熱門的話題,在動手學習之前,需要搭建深度學習框架,如pytorch、TensorFlow、caffe、mxnet等。
  • 深度學習自救指南(一)| Anaconda、PyTorch的下載和安裝
    在我們進行深度學習的過程中,離不開Anaconda環境和PyTorch深度學習框架。
  • 寫給純小白的深度學習環境搭建寶典:pytorch+tensorflow
    每天給小編五分鐘,小編用自己的代碼,讓你輕鬆學習人工智慧。本文將手把手帶你快速搭建你自己的深度學習環境,然後實現自己的第一個深度學習程序。野蠻智能,小白也能看懂的人工智慧。精講深度學習RNN三大核心點,三分鐘掌握循環神經網絡進行簡單了解。下面進入實戰環節。
  • 深度學習黑客競賽神器:基於PyTorch圖像特徵工程的深度學習圖像增強
    當我們沒有足夠的數據時,圖像增強是一個非常有效的方法我們可以在任何場合使用圖像增強進行深度學習——黑客競賽、工業項目等等我們還將使用PyTorch建立一個圖像分類模型,以了解圖像增強是如何形成圖片的在深度學習黑客競賽中表現出色的技巧(或者坦率地說,是任何數據科學黑客競賽) 通常歸結為特徵工程。
  • 從零開始深度學習Pytorch筆記(12)—— nn.Module
    從零開始深度學習Pytorch筆記(1)——安裝Pytorch從零開始深度學習Pytorch
  • 在Linux系統中安裝深度學習框架Pytorch
    設為星標才不會錯過哦     你好呀 我是然怡這篇推文是兩個月前復現深度學習論文時做的筆記一系列的筆記做了好幾篇看著閱讀量很低就沒有再發公眾號很久沒有推文了前幾天對公眾號進行了小改「然怡乾貨鋪」改為「水文sw」頭像也是換了的
  • Torch7 開源 PyTorch:Python 優先深度學習框架
    據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。PyTorch 是一個 Python 軟體包,其提供了兩種高層面的功能:如有需要,你也可以復用你最喜歡的 Python 軟體包(如 numpy、scipy 和 Cython)來擴展 PyTorch。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    選自PyTorch.org機器之心編譯參與:吳攀、李澤南、李亞洲Torch7 團隊開源了 PyTorch。據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。
  • Keras vs PyTorch:誰是第一深度學習框架?
    兩大框架的連結:  Keras:https://github.com/keras-team/keras (https://keras.io/)  PyTorch:https://github.com/pytorch/pytorch  你想學習深度學習嗎?
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    選自builtin作者:Vihar Kurama機器之心編譯參與:吳攀、杜偉谷歌的 Tensorflow 與 Facebook 的 PyTorch 一直是頗受社區歡迎的兩種深度學習框架。那麼究竟哪種框架最適宜自己手邊的深度學習項目呢?本文作者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了自己的建議。如果你在讀這篇文章,那麼你可能已經開始了自己的深度學習之旅。如果你對這一領域還不是很熟悉,那麼簡單來說,深度學習使用了「人工神經網絡」,這是一種類似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。
  • 手把手教 | 深度學習庫PyTorch(附代碼)
    介紹每隔一段時間,就會有一個有潛力改變深度學習格局的python庫誕生,PyTorch就是其中一員。 在過去的幾周裡,我一直沉浸在PyTorch中,我被它的易用性所吸引。同時我們還將對比分別用numpy和PyTorch從頭構建的神經網絡,以查看它們在具體實現中的相似之處。 讓我們開始吧! 注意:本文假定你對深度學習有基本的認知。
  • 【乾貨】史上最全的PyTorch學習資源匯總
    · 比較偏算法實戰的PyTorch代碼教程(https://github.com/yunjey/pytorch-tutorial):在github上有很高的star。建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。
  • 深度學習準「研究僧」預習資料:圖靈獎得主Yann LeCun《深度學習(Pytorch)》春季課程
    開學進入倒計時,深度學習方向的準「研究僧」們,你們準備好了嗎?轉眼 2020 年已經過半,又一屆深度學習方向的準研究生即將踏上「煉丹」之路。對於這一方向的新生來說,提前了解、學習這一專業領域的知識,會讓研究生涯有一個更加順暢的開端。列出的這些課程僅是冰山一角。
  • PyTorch 深度學習官方入門中文教程 pdf 下載|PyTorchChina
    PyTorch提供了兩個高級功能: 1.具有強大的GPU加速的張量計算(如Numpy) 2.包含自動求導系統的深度神經網絡 除了Facebook之外,Twitter、GMU和Salesforce等機構都採用了PyTorch。
  • 資料|【乾貨】PyTorch學習資源匯總
    建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。開源書籍:這是一本開源的書籍,目標是幫助那些希望和使用PyTorch進行深度學習開發和研究的朋友快速入門。但本文檔不是內容不是很全,還在持續更新中。簡單易上手的PyTorch中文文檔:非常適合新手學習。
  • 新手必備 | 史上最全的PyTorch學習資源匯總
    (3)這是一個比較偏算法實戰的PyTorch代碼教程,在github上有很高的star,https://github.com/yunjey/pytorch-tutorial。建議大家在閱讀本文檔之前,先學習上述兩個PyTorch基礎教程。(4)接下來為大家介紹一本開源書籍:https://github.com/zergtant/pytorch-handbook。