【学习笔记】 pytorch的使用语法和代码实例
數據類型
( 1) torch.FloatTensor : 用于生成數據類型為浮點型的Tensor ,傳遞給torch.FloatTensor的參數可以是一個列表,也可以是一個維度值。
torch.randn :用于生成數據類型為浮點型且維度指定的隨機Tensor ,和在N umPy中使用numpy . randn 生成隨機數的方法類似,隨機生成的浮點數的取值滿足均值為0 、方差為1的正態分布
torch.clamp : 對輸入參數按照自定義的范圍進行裁剪, 最后將參數裁剪的結果作為輸出。所以輸入參數一共有三個,分別是需要進行裁剪的Tensor 數據類型的變量、裁剪的上邊界和裁剪的下邊界, 具體的裁剪過程是: 使用變量中的每個元素分別和裁剪的上邊界及裁剪的下邊界的值進行比較,如果元素的值小于裁剪的下邊界的值, 該元素就被重寫成裁剪的下邊界的值: 同理,如果元素的值大于裁剪的上邊界的值, 該元素就被重寫成裁剪的上邊界的值。
結果:
torch.div : 將參數傳遞到to rch.div 后返回輸入參數的求商結果作為輸出,同樣,參與運算的參數可以全部是Tensor 數據類型的變量,也可以是Tensor 數據類型的變量和標量的組合。
torch.mm : 將參數傳遞到torch.mm 后返回輸入參數的求積結果作為輸出,不過這個求積的方式和之前的torch.mul運算方式不太一樣, torch.mm 運用矩陣之間的乘法規則進行計算,所以被傳入的參數會被當作矩陣進行處理, 參數的維度自然也要滿足矩陣乘法的前提條件,即前一個矩陣的行數必須和后一個矩陣的列數相等,否則不能進行計算。
torch.mv : 將參數傳遞到torch.mv后返回輸入參數的求積結果作為輸出,torch.mv運用矩陣與向量之間的乘法規則進行計算, 被傳入的參數中的第1個參數代表矩陣,第2個參數代表向量, 順序不能顛倒。
torch. autograd
torch. autograd 包的主要功能是完成神經網絡后向傳播中的鏈式求導,手動實現鏈式求導的代碼會給我們帶來很大的困擾,而torch.autograd 包中豐富的類減少了這些不必要的麻煩
。如果用autograd.Variable 來定義參數,則 Variable 自動定義了兩個變量,data代表原始權重數據;而 grad 代表求導后的數據,也就是梯度。每次迭代過程就用這個 grad 對權重數據進行修正。
實現自動梯度功能的過程大致為:先通過輸入的Tensor 數據類型的變量在神經網絡的前向傳播過程中生成一張計算圖,然后根據這個計算圖和輸出結果準確計算出每個參數需要更新的梯度,并通過完成后向傳播完成對參數的梯度更新。
這個包的使用:
input_ data 是輸入數據的特征個數, hidden_layer 是通過隱藏層后輸出的特征數,output_ data 是最后輸出的分類結果數,如果requires_grad 的值是False ,那么表示該變量在進行自動梯度計算的過程中不會保留梯度值,將輸入的數據x 和輸出的數據y 的requires_grad 參數均設置為False , 這是因為這兩個變量并不是我們的模型需要優化的參數。w1 w2的requires_grad 參數均設置為True 。
關于Variable :Variable 不光包含了數據,還包含了其他東西,
x=Variable(torch.Tensor(2,2)) 默認 Variable 是有導數 grad的,x.data 是數據,這里 x.data 就是Tensor。x.grad 是計算過程中動態變化的導數。
定義訓練次數和學習率:
epoch_n = 20 learning_rate = 1e-6權值更新方法:
weight = weight + learning_rate * gradient learning_rate = 0.01 for f in model.parameters():f.data.sub_(f.grad.data * learning_rate)learning_rate 是學習速率,多數時候就叫做 lr,是學習步長,用步長 *導數就是每次權重修正的 delta 值,lr 越大表示學習的速度越快,相應的精度就會降低。
如同使用PyTorch 中的自動梯度方法一樣,在搭建復雜的神經網絡模型的時候, 我們也可以使用PyTorch 中己定義的類和方法,這些類和方法覆蓋了神經網絡中的線性變換、激活函數、卷積層、全連接層、池化層等常用神經網絡結構的實現。在完成模型的搭建之后, 我們還可以使用PyTorch 提供的類型豐富的優化函數來完成對模型參數的優化, 除此之外, 還有很多防止模型在模型訓練過程中發生過擬合的類。
torch.nn
PyTorch 中的torch.nn 包提供了很多與實現神經網絡中的具體功能相關的類,這些類涵蓋了深度神經網絡模型在搭建和參數優化過程中的常用內容,比如神經網絡中的卷積層、池化層、全連接層這類層次構造的方法、防止過擬合的參數歸一化方法、Dropout 方法,還有激活函數部分的線性激活函數、非線性激活函數相關的方法, 等等
torch .nn 包中的類能夠幫助我們自動生成和初始化對應維度的權重參數。模型搭建的代碼如下:
通過torch.nn .Linear( input_data, hidden layer)完成從輸入層到隱藏層的線性變換,然后經過激活函數及torch.nn .Linear(hidden layer, output_ da ta)完成從隱藏層到輸出層的線性變換。torch.nn.Linear 類接收的參數有三個,分別是輸入特征數、輸出特征數和是否使用偏置,設置是否使用偏置的參數是一個布爾值,默認為True ,即使用偏置。在實際使用的過程中,我們只需將輸入的特征數和輸出的特征數傳遞給
torch.nn.Linear 類, 就會自動生成對應維度的權重參數和偏置
torch.nn.Sequential類是torch. nn 中的一種序列容器,通過
在容器中嵌套各種實現神經網絡中具體功能相關的類,來完成對神經網絡模型的搭建,最主要的是,參數會按照我們定義好的序列自動傳遞下去。我們可以將嵌套在容器中的各個部分看作各種不同的模塊,這些模塊可以自由組合。模塊的加入一般有兩種方式, 一種是在以上代碼中使用的直接嵌套,另一種是以orderdict 有序字典的方式進行傳入,這兩種方式的唯一區別是,使用后者搭建的模型的每個模塊都有我們自定義的名字, 而前者默認使用從零開始的數字序列作為每個模塊的名字。下面通過示例來直觀地看一下字典方
式搭建的模型。
字典:
torch.nn.Linear類用于定義模型的線性層,即完成前面提到的
不同的層之間的線性變換。torch.nn.Linear 類接收的參數有三個,分別是輸入特征數、輸出特征數和是否使用偏置,設置是否使用偏置的參數是一個布爾值,默認為True ,即使用偏置。在實際使用的過程中,我們只需將輸入的特征數和輸出的特征數傳遞給torch.nn.Linear 類, 就會自動生成對應維度的權重參數和偏置
torch.nn.ReLU 類屬于非線性激活分類,在定義時默認不需要傳入參數。當然,在torch.nn 包中還有許多非線性激活函數類可供選擇,比如之前講到的PReLU 、LeakyReLU 、Tanh 、S igmoid 、Softmax 等。
torch.nn.MSELoss類使用均方誤差函數對損失值進行計算,
在定義類的對象時不用傳入任何參數,但在使用實例時需要輸入兩個維度一樣的參數方可進行計算
torch.nn.L1Loss 類使用平均絕對誤差函數對損失值進行計算,
同樣,在定義類的對象時不用傳入任何參數,但在使用實例時需要輸入兩個維度一樣的參數進行計算。
torch.nn.CrossEntropyLoss 類用于計算交叉熵,在定義類的對象時不用傳入任何參數,在使用實例時需要輸入兩個滿足交叉熵計算條件的參數
nn.NLLLoss2d
和上面類似,但是多了幾個維度,一般用在圖片上。
input, (N, C, H, W)
target, (N, H, W)
比如用全卷積網絡做分類時,最后圖片的每個點都會預測一個類別標簽。
Adam 優化函數還有一個強大的功能,就是可以對梯度更新使用到的學習速率進行自適應調節
PyTorch 之torch.optim
優化器Optim
優化器用通俗的話來說就是一種算法,是一種計算導數的算法。各種優化器的目的和發明它們的初衷其實就是能讓用戶選擇一種適合自己場景的優化器。優化器的最主要的衡量指標就是優化曲線的平穩度,最好的優化器就是每一輪樣本數據的優化都讓權重參數勻速的接近目標值,而不是忽上忽下跳躍的變化。因此損失值的平穩下降對于一個深度學習模型來說是一個非常重要的衡量指標。
在PyTorch 的torch.optim 包中提供了非常多的可實現參數自動優化的類,比如SGD 、AdaGrad 、RMS Prop 、Adam 等,這些類都可以被直接調用,使用起來也非常方便。可以直接調用optimzer. zero_grad 來完成對模型參數梯度的歸零; optimzer.step , 它的主要功能是使用計算得到的梯度值對各個節點的參數進行梯度更新。
SGD
SGD 指stochastic gradient descent,即隨機梯度下降,隨機的意思是隨機選取部分數據集參與計算,是梯度下降的 batch 版本。SGD 支持動量參數,支持學習衰減率
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)lr:大于 0 的浮點數,學習率。
momentum:大于 0 的浮點數,動量參數。
parameters:Variable 參數,要優化的對象。
對于訓練數據集,我們首先將其分成 n 個 batch,每個 batch 包含 m 個樣本。我們每次更新都利用一個 batch 的數據,而非整個訓練集,
手寫數字識別
使用torchvision. datasets 可以輕易實現對這些數據集的訓練集和測試集的下載,只需要使用torchvision.datasets 再加上需要下載的數據集的名稱就可以了,
1.下載數據集:
train 用于指定在數據集下載完成后需要載入哪部分數據,如果設置為True ,則說明載入的是該數據集的訓練集部分; 如果設置為False ,則說明載入的是該數據集的測試集部分。
torch.transforms 中有大量的數據變換類, 其中有很大一部分可以用于實現數據增強
torchvision. transforms 中常用的數據變換操作:
torchvision.transforms.Resize :用于對載入的圖片數據按我們需求的大小進行縮放。傳遞給這個類的參數可以是一個整型數據,也可以是一個類似于(h , w)的序列, 其中, h 代表高度, w 代表寬度,但是如果使用的是一個整型數據,那么表示縮放的寬度和高度都是這個整型數據的值。
torchvision.transforms.Scale : 用于對載入的圖片數據按我們需求的大小進行縮放,用法和torchvision . transforms.Resize 類似
torchvision.transforms.CenterCrop :用于對載入的圖片以圖片中心為參考點, 按我們需要的大小進行裁剪。傳遞給這個類的參數可以是一個整型數據,也可以是一個類似于( h , w )的序列。
torchvision.transforms.RandomHorizontaIFlip : 用于對載入的圖片按隨機概率進行水平翻轉。我們可以通過傳遞給這個類的參數自定義隨機概率,如果沒有定義,則使用默認的概率值0.5
torchvision.transforms.Random VerticalFlip : 用于對載入的圖片按隨機概率進行垂直翻轉。我們可以通過傳遞給這個類的參數自定義隨機概率,如果沒有定義,則使用默認的概率值0. 5
torchvision.transforms. ToPILlmage : 用于將Tensor 變量的數據轉換成PIL 圖片
torchvision.transforms. ToTensor : 用于對載入的圖片數據進行類型轉換, 將之前構成PIL 圖片的數據轉換成Tensor 數據類型的變量, 讓PyTorch 能夠對其進行計算和處理。
torchvision.transforms.Compose 類看作一種容器, 它能夠同時對多種數據變換進行組合。傳入的參數是一個列表,列表中的元素就是對載入的數據進行的各種變換操作。如:
transform =transforms.Compose([transforms.ToTensor(),
transforms.Normalize(mean=[0.5, 0.5, 0.5] , std=[0.5 , 0.5, 0.5])])
transforms.Normalize這里使用的標準化變換也叫作標準差變換法,這種方法需要使用原始數據的均值( Mean )和標準差來進行數據的標準化,在經過標準化變換之后,數據全部符合均值為0 、標準差為1的標準正態分布
2.裝載圖片:
data_loader_train = torch.utils.data.DataLoader(dataset=data_train,batch_size = 64,shuffle = True) data_loader_test= torch.utils.data.DataLoader (dataset=data_test,batch_size = 64 ,shuffle = True)對數據的裝載使用的是torch.utils .data. Data Loader 類, 類中的dataset 參數用于指定我們載入的數據集名稱, batch_s ize 參數設置了每個包中的圖片數據個數,代碼中的值是64,
所以在每個包中會包含64 張圖片。將shuffle 參數設置為True , 在裝載的過程會將數據隨機打亂順序并進行打包。
全部代碼:
因為下載過程中實在太慢,一小時了才百分之零點幾,所有就沒有繼續跑了。
模型搭建和參數優化
在順利完成數據裝載后, 我們就可以開始編寫卷積神經網絡模型的搭建和參數優化的代碼了。因為我們想要搭建一個包含了卷積層、激活函數、池化層、全連接層的卷積神經網絡來解決這個問題,所以模型在結構上會和之前簡單的神經網絡有所區別, 當然, 各個部分的功能實現依然是通過torch.nn 中的類來完成的
如卷積層使用torch.nn.Conv2d 類方法來搭建; 激活層使用torch.nn.ReLU 類方法來搭建; 池化層使用torch.nn .MaxPool2d
實現卷積神經網絡模型搭建的代碼如下:
class Model(torch . nn .Module):def init (self):super(Model,self)__init__()self.convl=torch.nn.Sequential(torch.nn.Conv2d (l, 64 ,kernel_size=3 , stride=l , padding=l) ,torch.nn.ReLU (),torch.nn.Conv2d(64,128,kernel_size=3 , stride=l,padding=l),torch.nn.ReLU() ,torch.nn.MaxPool2d(stride=2,kernel size=2))self.dense=torch.nn.Sequential(torch.nn.Linear(14*14*128,10 24);torch.nn.ReLU(),torch.nn.Dropout (p=O.5) ,torch.nn.Linear (1024, 10))def forward(self, x) :x = self.convl(x)x = x.view(-1 , 14*14*128)x = self.dense(x)return xtorch.nn.Conv2d :用于搭建卷積神經網絡的卷積層,Paddingde 的數據類型是整型,值為0 時表示不進行邊界像素的填充,如果值大于0 ,那么增加數字所對應的邊界像素層數。
torch.nn.MaxPool2d : 用于實現卷積神經網絡中的最大池化層,主要的輸入參數是池化窗口大小、池化窗口移動步長和Paddingde 值。
torch.nn.Dropout 類用于防止卷積神經網絡在訓練的過程中發
生過擬合, 其工作原理簡單來說就是在模型訓練的過程中,以一定的隨機概率將卷積神經網絡模型的部分參數歸零, 以達到減少相鄰兩層神經連接的目的
nn.Sequential:一個Sequential容器,是一個包含其他模塊的模塊,它可以快速搭建神經網絡
Linear:每個Linear模塊使用線性函數來計算,它會內部創建需要的weight和bias
一些代碼的解釋:
獲取一個批次的數據井迸行數據預覽和分析,代碼如下:
X_example , y_example = next(iter(dataloader [“train” ]))
以上代碼通過next 和iter迭代操作獲取一個批次的裝載數據
_, predicted = torch.max(outputs.data, 1):
首先,torch.max()這個函數返回的是兩個值,第一個值是具體的value(我們用下劃線_表示),第二個值是value所在的index(也就是predicted)。數字1其實可以寫為dim=1,這里簡寫為1,python也可以自動識別,dim=1表示輸出所在行的最大值,若改寫成dim=0則輸出所在列的最大值。
總結
以上是生活随笔為你收集整理的【学习笔记】 pytorch的使用语法和代码实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【笔记】numpy使用详解 matplo
- 下一篇: 【链表】链表变化时其中的节点变化情况