從基礎概念到實現,小白如何快速入門PyTorch

2021-02-21 機器之心

PyTorch 是一個有潛力能改變深度學習實現面貌的 Python 庫,它的使用非常靈活與輕鬆。在本文中,我們將以更實用的方式探索 PyTorch,包括基礎知識和案例研究等。此外,本文還將比較使用 NumPy 和 PyTorch 從頭構建神經網絡的方式,以了解它們在實現中的相似之處。

PyTorch 的構建者表明,PyTorch 的哲學是解決當務之急,也就是說即時構建和運行我們的計算圖。這恰好適合 Python 的編程方法,因為我們不需等待整個代碼都被寫入才能知道是否起作用。我們很容易運行部分代碼,並實時檢查它。

PyTorch 是一個基於 Python 的庫,旨在為深度學習提供一個靈活的開發平臺。PyTorch 的工作流程非常接近於 Python 的科學計算庫 NumPy。那麼為什麼我們需要使用 PyTorch 構建深度學習模型?以下作者根據實際經驗提供了三個理由:

便於使用的 API:它的使用如同 Python 那樣簡單。

支持 Python:正如上文所述,PyTorch 可以平滑地與 Python 數據科學棧相結合。它與 NumPy 一樣簡單,甚至我們都感覺不出它們的區別。

動態計算圖:PyTorch 不再採用特定的函數預定義計算圖,而是提供構建動態計算圖的框架,甚至我們可以在運行時修正它們。這種動態框架在我們不知道所構建的神經網絡需要多少內存時非常有用。

其它一些使用 PyTorch 的優點還有多 GPU 支持、自定義數據加載器和極簡的預處理過程等。自從它在 2016 年 1 月份發布以來,許多研究者將其採用為標準的實現庫,因為它構建新穎的、極其複雜的計算圖同樣非常簡單。即使這樣,PyTorch 被主流數據科學家和研究員接收還是花了很長時間,因為它目前仍然是新的項目,且還有很多地方需要構建與完善。

PyTorch 基礎

在討論 PyTorch 的各個組件前,我們需要了解它的工作流。PyTorch 使用一種稱之為 imperative / eager 的範式,即每一行代碼都要求構建一個圖以定義完整計算圖的一個部分。即使完整的計算圖還沒有完成構建,我們也可以獨立地執行這些作為組件的小計算圖,這種動態計算圖被稱為「define-by-run」方法。

更多介紹請查看:http://pytorch.org/about/

安裝 PyTorch 非常簡單,我們可以按照自己的系統跟隨官方文檔的步驟輕鬆完成。例如以下選擇在 Linux、Python 3.5 和 CUDA 9.1 的環境下安裝 PyTorch:

conda install pytorch torchvision cuda91 -c pytorch

我們在基礎部分主要需要了解的 PyTorch 元素有 PyTorch 張量、數學運算、自動求導模塊、最優化模塊和神經網絡模塊。下面本文會依次對這些模塊進行簡要的介紹:

PyTorch 張量

正如 PyTorch 文檔所說,如果我們熟悉 NumPy 的多維數組,那麼 Torch 張量的很多操作我們能輕易地掌握。PyTorch 提供了 CPU 張量和 GPU 張量,並且極大地加速了計算的速度。

從張量的構建與運行就能體會到 PyTorch 相比 TensorFLow 需要聲明張量、初始化張量要簡潔地多。以下語句將隨機初始化一個 5×3 的二維張量,因為 PyTorch 是一種動態圖,所以它聲明和真實賦值是同時進行的。

torch.Tensor(5, 3)

----

2.4878e+04  4.5692e-41  2.4878e+04

4.5692e-41 -2.9205e+19  4.5691e-41

1.2277e-02  4.5692e-41 -4.0170e+19

4.5691e-41  1.2277e-02  4.5692e-41

0.0000e+00  0.0000e+00  0.0000e+00

[torch.FloatTensor of size 5x3]

若我們希望隨機初始化的張量服從某些分布,那麼我們可以直接對張量對象使用一些方法。如下初始化的張量將服從均勻分布:

torch.Tensor(5, 3).uniform_(-1, 1)



-0.2767 -0.1082 -0.1339

-0.6477  0.3098  0.1642

-0.1125 -0.2104  0.8962

-0.6573  0.9669 -0.3806

0.8008 -0.3860  0.6816

[torch.FloatTensor of size 5x3]

在 PyTorch 中,torch.Tensor 是一種多維矩陣,其中每個元素都是一個單一的數據類型,且該構造函數默認的為 torch.FloatTensor。以下是具體張量的類型:

除了直接定義維度,一般我們還可以從 Python 列表或 NumPy 數組中創建張量。而且根據 Python 列表和元組等數據結構的習慣,我們可以使用相似的索引方式進行取值或賦值等。以下通過 Python 列表創建一個 Torch 張量,並通過索引賦值:

>>> torch.FloatTensor([[1, 2, 3], [4, 5, 6]])

1  2  3

4  5  6

[torch.FloatTensor of size 2x3]

>>> print(x[1][2])

6.0

>>> x[0][1] = 8

>>> print(x)

1  8  3

4  5  6

[torch.FloatTensor of size 2x3]

若 x 為我們定義的 5×3 Torch 張量,且初始化數值服從-1 到 1 的均勻分布,那麼我們可以執行很多基礎的數學運算。以下執行了一個簡單的矩陣間對應元素乘積。


x = torch.Tensor(5, 3).uniform_(-1, 1)

y = x * torch.randn(5, 3)

print(y)



0.2200 -0.0368  0.4494

-0.2577 -0.0343  0.1587

-0.7503 -0.1729  0.0453

0.9296 -0.1067 -0.6402

-0.3276  0.0158 -0.0552

[torch.FloatTensor of size 5x3]

PyTorch 同樣支持廣播(Broadcasting)操作,一般它會隱式地把一個數組的異常維度調整到與另一個算子相匹配的維度以實現維度兼容。為了定義兩個形狀是否是可兼容的,PyTorch 會從最後開始往前逐個比較它們的維度大小。在這個過程中,如果兩者的對應維度相同,或者其一(或者全是)等於 1,則繼續進行比較,直到最前面的維度。若不滿足這兩個條件,程序就會報錯。如下展示了 PyTorch 的廣播操作:


print (x.size())

y = x + torch.randn(5, 1)

print(y)



torch.Size([5, 3])

0.1919 -0.5006 -1.2410

-0.8080  0.1407 -0.6193

-1.6629 -0.1580 -0.3921

1.0395  0.7069 -0.1459

1.9027  1.4343  1.2299

[torch.FloatTensor of size 5x3]

正如 PyTorch 在官網上所說,PyTorch 是一個張量和動態神經網絡 Python 庫,它有著極其強大的 GPU 加速性能。我們一般可以直接定義 GPU 張量,也可以由 CPU 張量轉化為 GPU 張量。如下,我們定義了兩個 GPU 張量,並對這兩個張量執行矩陣乘法。當然,我們也可以如下所示將 CPU 張量轉換為 GPU 張量。

x = torch.cuda.HalfTensor(5, 3).uniform_(-1, 1)

y = torch.cuda.HalfTensor(3, 5).uniform_(-1, 1)

torch.matmul(x, y)

---

0.2456  1.1543  0.5376  0.4358 -0.0369

0.8247 -0.4143 -0.7188  0.3953  0.2573

-0.1346  0.7329  0.5156  0.0864 -0.1349

-0.3555  0.3135  0.3921 -0.1428 -0.1368

-0.4385  0.5601  0.6533 -0.2793 -0.5220

[torch.cuda.HalfTensor of size 5x5 (GPU 0)]



x = torch.FloatTensor(5, 3).uniform_(-1, 1)

print(x)

x = x.cuda(device=0)

print(x)

x = x.cpu()

print(x)

數學運算

如 NumPy 一樣,高效地實現數學函數對於科學計算庫至關重要。PyTorch 提供了一個簡單的接口,並支持 200 多種數學運算,以下是 PyTorch 實現簡單加運算的過程:

a = torch.FloatTensor([2])
b = torch.FloatTensor([3])

a + b
5
[torch.FloatTensor of size 1]

這種運算與 Python 非常像,我們可以在定義的 PyTorch 張量上執行多種矩陣運算。例如我們可以轉置二維張量:

matrix = torch.randn(3, 3)
matrix
-1.3531 -0.5394  0.8934
1.7457 -0.6291 -0.0484
-1.3502 -0.6439 -1.5652
[torch.FloatTensor of size 3x3]
matrix.t()
-2.1139  1.8278  0.1976
0.6236  0.3525  0.2660
-1.4604  0.8982  0.0428
[torch.FloatTensor of size 3x3]

AutoGrad 模塊

TensorFlow、Caffe 和 CNTK 等大多數框架都是使用的靜態計算圖,開發者必須建立或定義一個神經網絡,並重複使用相同的結構來執行模型訓練。改變網絡的模式就意味著我們必須從頭開始設計並定義相關的模塊。

但 PyTorch 使用的技術為自動微分(automatic differentiation)。在這種機制下,系統會有一個 Recorder 來記錄我們執行的運算,然後再反向計算對應的梯度。這種技術在構建神經網絡的過程中十分強大,因為我們可以通過計算前向傳播過程中參數的微分來節省時間。

from torch.autograd import Variable

x = Variable(train_x)
y = Variable(train_y, requires_grad=False)

從概念上來說,Autograd 會維護一個圖並記錄對變量執行的所有運算。這會產生一個有向無環圖,其中葉結點為輸入向量,根結點為輸出向量。通過從根結點到葉結點追蹤圖的路徑,我們可以輕易地使用鏈式法則自動計算梯度。

在內部,Autograd 將這個圖表徵為 Function 對象的圖,並且可以應用 apply() 計算評估圖的結果。在計算前向傳播中,當 Autograd 在執行請求的計算時,它還會同時構建一個表徵梯度計算的圖,且每個 Variable 的 .grad_fn 屬性就是這個圖的輸入單元。在前向傳播完成後,我們可以在後向傳播中根據這個動態圖來計算梯度。

以下展示了通過 backward() 和 torch.autograd.grad 計算梯度的方法,其中 torch.eq() 評估表達式是不是相等,即 x.grad 的計算結果是不是等於 2x。

x = Variable(torch.Tensor(5, 3).uniform_(-1, 1), requires_grad=True)

y = Variable(torch.Tensor(5, 3).uniform_(-1, 1), requires_grad=True)

z = x ** 2 + 3 * y

z.backward(gradient=torch.ones(5, 3))



torch.eq(x.grad, 2 * x)



Variable containing:

1  1  1

1  1  1

1  1  1

1  1  1

1  1  1

[torch.ByteTensor of size 5x3]

以下展示了對 y 求導的結果,即 dz/dy。從上面 z 的定義可知結果應該是 3,那麼以下展示了該計算過程:

y.grad

-

Variable containing:

3  3  3

3  3  3

3  3  3

3  3  3

3  3  3

[torch.FloatTensor of size 5x3]

前面是使用 backward() 求解變量的梯度,後面我們也可以使用 torch.autograd.grad 計算梯度。如下所示,我們使用另外一種方式求解同一個函數的梯度。

x = Variable(torch.Tensor(5, 3).uniform_(-1, 1), requires_grad=True)

y = Variable(torch.Tensor(5, 3).uniform_(-1, 1), requires_grad=True)

z = x ** 2 + 3 * y


dz_dx = torch.autograd.grad(z, x, grad_outputs=torch.ones(5, 3))

dz_dy = torch.autograd.grad(z, y, grad_outputs=torch.ones(5, 3))

最優化模塊

torch.optim 是實現神經網絡中多種優化算法的模塊,它目前已經支持大多數一般的方法,所以我們不需要從頭構建優化算法。以下展示了使用 Adam 優化器的基本代碼:

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

神經網絡模塊


PyTorch AutoGrad 使得計算圖的定義和梯度的計算十分簡單,但原版的 AutoGrad 可能對定義複雜的神經網絡顯得太底層,因此我們需要神經網絡模塊幫助簡化工作。該 nn 包定義了一組函數,我們可以將其視為有一些可訓練權重的神經網絡層級。我們也可以將該神經網絡模塊視為類似於 Keras 的 PyTorch 組件。

我們一般可以使用 torch.nn 包構建神經網絡,下面提供了一些 API 的表達及意義:

線性層- nn.Linear、nn.Bilinear

卷積層 - nn.Conv1d、nn.Conv2d、nn.Conv3d、nn.ConvTranspose2d

非線性激活函數- nn.Sigmoid、nn.Tanh、nn.ReLU、nn.LeakyReLU

池化層 - nn.MaxPool1d、nn.AveragePool2d

循環網絡 - nn.LSTM、nn.GRU

歸一化 - nn.BatchNorm2d

Dropout - nn.Dropout、nn.Dropout2d

嵌入 - nn.Embedding

損失函數 - nn.MSELoss、nn.CrossEntropyLoss、nn.NLLLoss

import torch

# define model
model = torch.nn.Sequential(
torch.nn.Linear(input_num_units, hidden_num_units),
torch.nn.ReLU(),
torch.nn.Linear(hidden_num_units, output_num_units),
)
loss_fn = torch.nn.CrossEntropyLoss()

以上就是 PyTorch 的基本組件,我們可以使用它們快速構建神經網絡。當然以上只是簡單的概念介紹,每一個模塊都有非常多的函數與方法,讀者可詳細查閱 PyTorch 文檔了解更多。

構建神經網絡(NumPy vs. PyTorch)

在這一部分中,我們分別使用 NumPy 和 PyTorch 構建簡單的神經網絡以實現二元分類問題,本文的後面會對這一部分的代碼進行解釋。

## Neural network in numpy

import numpy as np

#Input array
X=np.array([[1,0,1,0],[1,0,1,1],[0,1,0,1]])

#Output
y=np.array([[1],[1],[0]])

#Sigmoid Function
def sigmoid (x):
return 1/(1 + np.exp(-x))

#Derivative of Sigmoid Function
def derivatives_sigmoid(x):
return x * (1 - x)

#Variable initialization
epoch=5000 #Setting training iterations
lr=0.1 #Setting learning rate
inputlayer_neurons = X.shape[1] #number of features in data set
hiddenlayer_neurons = 3 #number of hidden layers neurons
output_neurons = 1 #number of neurons at output layer

#weight and bias initialization
wh=np.random.uniform(size=(inputlayer_neurons,hiddenlayer_neurons))
bh=np.random.uniform(size=(1,hiddenlayer_neurons))
wout=np.random.uniform(size=(hiddenlayer_neurons,output_neurons))
bout=np.random.uniform(size=(1,output_neurons))

for i in range(epoch):
 #Forward Propogation
 hidden_layer_input1=np.dot(X,wh)
 hidden_layer_input=hidden_layer_input1 + bh
 hiddenlayer_activations = sigmoid(hidden_layer_input)
 output_layer_input1=np.dot(hiddenlayer_activations,wout)
 output_layer_input= output_layer_input1+ bout
 output = sigmoid(output_layer_input)

 #Backpropagation
 E = y-output
 slope_output_layer = derivatives_sigmoid(output)
 slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)
 d_output = E * slope_output_layer
 Error_at_hidden_layer = d_output.dot(wout.T)
 d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
 wout += hiddenlayer_activations.T.dot(d_output) *lr
 bout += np.sum(d_output, axis=0,keepdims=True) *lr
 wh += X.T.dot(d_hiddenlayer) *lr
 bh += np.sum(d_hiddenlayer, axis=0,keepdims=True) *lr

print('actual :\n', y, '\n')
print('predicted :\n', output)

現在,我們會發現使用 PyTorch 實現相同的網絡會非常簡單。以下的代碼同樣也用粗體表示出它與 NumPy 的不同之處:

## neural network in pytorch*import torch*

#Input array
X = *torch.Tensor*([[1,0,1,0],[1,0,1,1],[0,1,0,1]])

#Output
y = *torch.Tensor*([[1],[1],[0]])

#Sigmoid Function
def sigmoid (x):
 return 1/(1 + *torch.exp*(-x))

#Derivative of Sigmoid Function
def derivatives_sigmoid(x):
 return x * (1 - x)

#Variable initialization
epoch=5000 #Setting training iterations
lr=0.1 #Setting learning rate
inputlayer_neurons = X.shape[1] #number of features in data set
hiddenlayer_neurons = 3 #number of hidden layers neurons
output_neurons = 1 #number of neurons at output layer

#weight and bias initialization
wh=*torch.randn*(inputlayer_neurons, hiddenlayer_neurons)*.type(torch.FloatTensor)*
bh=*torch.randn*(1, hiddenlayer_neurons)*.type(torch.FloatTensor)*
wout=*torch.randn*(hiddenlayer_neurons, output_neurons)
bout=*torch.randn*(1, output_neurons)

for i in range(epoch):

 #Forward Propogation
 hidden_layer_input1 = *torch.mm*(X, wh)
 hidden_layer_input = hidden_layer_input1 + bh
 hidden_layer_activations = sigmoid(hidden_layer_input)

 output_layer_input1 = *torch.mm*(hidden_layer_activations, wout)
 output_layer_input = output_layer_input1 + bout
 output = sigmoid(output_layer_input1)

 #Backpropagation
 E = y-output
 slope_output_layer = derivatives_sigmoid(output)
 slope_hidden_layer = derivatives_sigmoid(hidden_layer_activations)
 d_output = E * slope_output_layer
 Error_at_hidden_layer = *torch.mm*(d_output, wout.t())
 d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
 wout += *torch.mm*(hidden_layer_activations.t(), d_output) *lr
 bout += d_output.sum() *lr
 wh += *torch.mm*(X.t(), d_hiddenlayer) *lr
 bh += d_output.sum() *lr

print('actual :\n', y, '\n')
print('predicted :\n', output)

對比其它深度學習庫

在一份基準腳本中,它展示出 PyTorch 在訓練長短期記憶(LSTM)網絡上比其它主要框架的表現都要好,因為它運行一個 Epoch 有最少的中位數時間。

PyTorch 中的數據加載 API 經過了優良的設計,接口是針對特定數據集、採樣器和數據加載器而構建的。對比於 TensorFlow 的數據加載工具(readers, queues 等),我發現 PyTorch 的數據加載模塊更易於使用。同時它們還能無縫對接神經網絡構建模塊,所以我們不需要第三方高級庫。

然而,我並不推薦使用使用 PyTorch 部署模型,因為 PyTorch 仍然不是那麼成熟。正如 PyTorch 開發者所說:「我們經常看到用戶首先創建一個 PyTorch 模型來測試是否可行,然後當需要部署模型到生產中時,他們會轉化為 Caffe 2 等其他框架,並將其部署到移動端或其它平臺。」

案例研究

前面我們已經了解了PyTorch的基本組成元素與特性,下面我們會通過線性回歸與手寫字體識別兩個具體的案例探討如何使用 PyTorch 構建高效地模型。

PyTorch 線性回歸

定義數據:

import torch

from torch.autograd import Variable

x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]]))

y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]]))

定義模型,在 PyTorch 中,我們可以使用高級 API 來定義相關的模型或層級。如下定義了「torch.nn.Linear(1, 1)」,即一個輸入變量和一個輸出變量。

class Model(torch.nn.Module):

  def __init__(self):

      """

      In the constructor we instantiate two nn.Linear module

      """

      super(Model, self).__init__()

      self.linear = torch.nn.Linear(1, 1)  

  def forward(self, x):

      """

      In the forward function we accept a Variable of input data and we must return

      a Variable of output data. We can use Modules defined in the constructor as

      well as arbitrary operators on Variables.

      """

      y_pred = self.linear(x)

      return y_pred

構建損失函數和優化器,構建損失函數也可以直接使用「torch.nn.MSELoss(size_average=False)」調用均方根誤差函數。優化器可以使用「torch.optim.SGD()」提到用隨機梯度下降,其中我們需要提供優化的目標和學習率等參數。







criterion = torch.nn.MSELoss(size_average=False)

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

訓練模型,執行前向傳播計算損失函數,並優化參數:



for epoch in range(500):

     

  y_pred = model(x_data)

 

  loss = criterion(y_pred, y_data)

  print(epoch, loss.data[0])

 

  optimizer.zero_grad()

  loss.backward()

  optimizer.step()

用 PyTorch 解決圖像識別問題

為了進一步熟悉 PyTorch,我們將使用它解決 Analytics Vidhya 的深度學習實踐問題:識別手寫數字。我們的問題是給定一張 28 x 28 的圖像,利用模型識別其所代表的手寫數字。

所以首先我們需要下載訓練集與測試集,數據集包含了一個壓縮文件以儲存所有的圖像。其中 train.csv 和 test.csv 分別儲存了訓練和測試圖像,且圖像的格式為 png。下面我們將一步步構建簡單的神經網絡以實現手寫數字識別功能。

第 0 步:準備工作

a)導入必要的函數庫

# import modules
%pylab inline
import os
import numpy as np
import pandas as pd
from scipy.misc import imread
from sklearn.metrics import accuracy_score

b)設置隨機的 Seed,因此我們能控制模型產生的隨機數基本不變(偽隨機數)。

# To stop potential randomness
seed = 128
rng = np.random.RandomState(seed)

c)設置工作目錄的路徑。

root_dir = os.path.abspath('.')
data_dir = os.path.join(root_dir, 'data')

# check for existence
os.path.exists(root_dir), os.path.exists(data_dir)

第 1 步:加載與預處理數據

a)現在讀取 CSV 格式的數據集,並獲取文件名與對應的標註。

# load dataset
train = pd.read_csv(os.path.join(data_dir, 'Train', 'train.csv'))
test = pd.read_csv(os.path.join(data_dir, 'Test.csv'))

sample_submission = pd.read_csv(os.path.join(data_dir, 'Sample_Submission.csv'))

train.head()

b)接下來可以列印準備好的圖片。

# print an image
img_name = rng.choice(train.filename)
filepath = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)

img = imread(filepath, flatten=True)

pylab.imshow(img, cmap='gray')
pylab.axis('off')
pylab.show()

c)對於更簡單的數據操作,我們可以儲存所有的圖像作為 NumPy 數組。

# load images to create train and test set
temp = []
for img_name in train.filename:
 image_path = os.path.join(data_dir, 'Train', 'Images', 'train', img_name)
 img = imread(image_path, flatten=True)
 img = img.astype('float32')
 temp.append(img)

train_x = np.stack(temp)

train_x /= 255.0
train_x = train_x.reshape(-1, 784).astype('float32')

temp = []
for img_name in test.filename:
 image_path = os.path.join(data_dir, 'Train', 'Images', 'test', img_name)
 img = imread(image_path, flatten=True)
 img = img.astype('float32')
 temp.append(img)

test_x = np.stack(temp)

test_x /= 255.0
test_x = test_x.reshape(-1, 784).astype('float32')

train_y = train.label.values

d)因為這個是一個典型的機器學習問題,所以我們可以創建驗證集以監控模型的運行情況。下面我們以 7:3 的比例分割訓練集與驗證集。

# create validation set
split_size = int(train_x.shape[0]*0.7)

train_x, val_x = train_x[:split_size], train_x[split_size:]
train_y, val_y = train_y[:split_size], train_y[split_size:]

第 2 步:構建模型

a)下面是模型的主體,我們定義的神經網絡共有三層,即輸入層、隱藏層和輸出層。輸入層和輸出層的神經元數量是固定的,即 28 x 28 和 10 x 1,它們分別代表了輸入圖像的像素和類別。我們在隱藏層採用了 50 個神經元,並採用 Adam 作為最優化算法。

import torch
from torch.autograd import Variable
# number of neurons in each layer
input_num_units = 28*28
hidden_num_units = 500
output_num_units = 10

# set remaining variables
epochs = 5
batch_size = 128
learning_rate = 0.001

b)以下將開始訓練模型。

# define model
model = torch.nn.Sequential(
 torch.nn.Linear(input_num_units, hidden_num_units),
 torch.nn.ReLU(),
 torch.nn.Linear(hidden_num_units, output_num_units),
)
loss_fn = torch.nn.CrossEntropyLoss()

# define optimization algorithm
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
## helper functions
# preprocess a batch of dataset
def preproc(unclean_batch_x):
 """Convert values to range 0-1"""
 temp_batch = unclean_batch_x / unclean_batch_x.max()

 return temp_batch

# create a batch
def batch_creator(batch_size):
 dataset_name = 'train'
 dataset_length = train_x.shape[0]

 batch_mask = rng.choice(dataset_length, batch_size)

 batch_x = eval(dataset_name + '_x')[batch_mask]
 batch_x = preproc(batch_x)

 if dataset_name == 'train':
   batch_y = eval(dataset_name).ix[batch_mask, 'label'].values

 return batch_x, batch_y
# train network
total_batch = int(train.shape[0]/batch_size)

for epoch in range(epochs):
 avg_cost = 0
 for i in range(total_batch):
   # create batch
   batch_x, batch_y = batch_creator(batch_size)

   # pass that batch for training
   x, y = Variable(torch.from_numpy(batch_x)), Variable(torch.from_numpy(batch_y), requires_grad=False)
   pred = model(x)

   # get loss
   loss = loss_fn(pred, y)

   # perform backpropagation
   loss.backward()
   optimizer.step()
   avg_cost += loss.data[0]/total_batch

 print(epoch, avg_cost)
# get training accuracy
x, y = Variable(torch.from_numpy(preproc(train_x))), Variable(torch.from_numpy(train_y), requires_grad=False)
pred = model(x)

final_pred = np.argmax(pred.data.numpy(), axis=1)

accuracy_score(train_y, final_pred)
# get validation accuracy
x, y = Variable(torch.from_numpy(preproc(val_x))), Variable(torch.from_numpy(val_y), requires_grad=False)
pred = model(x)
final_pred = np.argmax(pred.data.numpy(), axis=1)

accuracy_score(val_y, final_pred)

這些分數非常令人滿意,因為我們只是用簡單的神經網絡訓練了 5 個 Epoch。以上,本文介紹了簡單的 PyTorch 入門概念,並利用簡單的案例熟悉 PyTorch 的使用。讀者可以繼續閱讀 PyTorch 的文檔以了解更多信息。

原文連結:https://www.analyticsvidhya.com/blog/2018/02/pytorch-tutorial/

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權

✄---

加入機器之心(全職記者/實習生):hr@jiqizhixin.com

投稿或尋求報導:editor@jiqizhixin.com

廣告&商務合作:bd@jiqizhixin.com

相關焦點

  • 【深度學習實戰】從基礎概念到實現,小白如何快速入門PyTorch
    在本文中,我們將以更實用的方式探索 PyTorch,包括基礎知識和案例研究等。此外,本文還將比較使用 NumPy 和 PyTorch 從頭構建神經網絡的方式,以了解它們在實現中的相似之處。PyTorch 的構建者表明,PyTorch 的哲學是解決當務之急,也就是說即時構建和運行我們的計算圖。這恰好適合 Python 的編程方法,因為我們不需等待整個代碼都被寫入才能知道是否起作用。
  • 帶你少走彎路:強烈推薦的Pytorch快速入門資料和翻譯(可下載)
    ,受到很多好評,讀者強烈建議我出一個pytorch的快速入門路線,經過翻譯和搜索網上資源,我推薦3份入門資料,希望對大家有所幫助。備註:TensorFlow的快速入門資料很負責任地說:看完這些資料,Pytorch基本入門了,接下來碰到問題能自己查資料解決了!
  • PyTorch 深度學習官方入門中文教程 pdf 下載|PyTorchChina
    它主要由Facebookd的人工智慧小組開發,不僅能夠 實現強大的GPU加速,同時還支持動態神經網絡,這一點是現在很多主流框架如TensorFlow都不支持的。 PyTorch提供了兩個高級功能: 1.具有強大的GPU加速的張量計算(如Numpy) 2.包含自動求導系統的深度神經網絡 除了Facebook之外,Twitter、GMU和Salesforce等機構都採用了PyTorch。
  • PyTorch 中文教程最新版
    其中,PyTorch 是當前難得的簡潔優雅且高效快速的框架,當前開源的框架中,沒有哪一個框架能夠在靈活性、易用性、速度這三個方面有兩個能同時超過 PyTorch。本文檔的定位是 PyTorch 入門教程,主要針對想要學習 PyTorch 的學生群體或者深度學習愛好者。
  • 【乾貨】史上最全的PyTorch學習資源匯總
    /tutorials/):對於英文比較好的同學,非常推薦該PyTorch官方文檔,一步步帶你從入門到精通。該文檔詳細的介紹了從基礎知識到如何使用PyTorch構建深層神經網絡,以及PyTorch語法和一些高質量的案例。
  • 智芯融:零基礎小白該如何入門FPGA?
    今天我們就講一講如何從零基礎入門FPGA成為初學者,也就是如何晉級成為一枚鳥蛋級別的FPGA工程師。很多人剛接觸FPGA,對它都是一知半解,當然,對於零基礎入門的自己來說,我們也要對自己保留一絲絲善意。那麼對於FPGA剛入門我們需要注意點什麼呢?
  • 新手必備 | 史上最全的PyTorch學習資源匯總
    該文檔詳細的介紹了從基礎知識到如何使用PyTorch構建深層神經網絡,以及PyTorch語法和一些高質量的案例。(2)PyTorch中文官方文檔:https://pytorch-cn.readthedocs.io/zh/latest/。
  • 小白入門 | 學習網絡安全需要什麼基礎?
    Hi這裡是東塔安全學院「小白入門【最核心的基礎】要有一顆持續學習的熱情和心,其他都好說;之前看到很多小白,不乏有一些高中學歷或者一些非計算機專業的學生,能夠通過持續的學習,入門網絡安全,進入工作崗位不斷學習,最終走上職業巔峰的一些典型案例。
  • 60分鐘入門PyTorch
    60 分鐘帶你快速入門 PyTorch 的官方教程。文末有最新的更新,介紹了深度學習的入門資料推薦、PyTorch 的教程推薦,如果閱讀本文後還是有些困難的,可以看看文末推薦的深度學習書籍和教程,先入門深度學習,有一定基礎再學習 PyTorch,效果會更好!)
  • 資料|【乾貨】PyTorch學習資源匯總
    該文檔詳細的介紹了從基礎知識到如何使用PyTorch構建深層神經網絡,以及PyTorch語法和一些高質量的案例。PyTorch中文官方文檔:閱讀上述英文文檔比較困難的同學也不要緊,我們為大家準備了比較官方的PyTorch中文文檔,文檔非常詳細的介紹了各個函數,可作為一份PyTorch的速查寶典。比較偏算法實戰的PyTorch代碼教程:在github上有很高的star。
  • 庫、教程、論文實現,這是一份超全的PyTorch資源列表(Github 2.2K星)
    1.pytorch text:Torch 文本相關的內容。項目地址:https://github.com/pytorch/text2.pytorch-seq2seq:在 PyTorch 中實現序列到序列(seq2seq)模型的框架。
  • 學習圍棋,小白必須知道的幾個概念,快速入門
    主要是沒弄個清大體的學棋思路,認識一下新手學棋思路,幫助你快速入門。,黑先白後,依次在交叉點上行棋 認識棋盤區域:角,邊,中腹(金角,銀邊,草肚皮) 認識棋子的氣:一個棋子為例,中腹最多4口氣,邊最多3口氣,角最多2口氣 認識吃子:棋子沒氣被提子,循環吃子情況,被提子方需要停一手 認識勝負概念
  • 小白如何快速的學習吉他
    下面,紅棉樂器為廣大吉他入門學者講解一下小白如何快速的學習吉他。一、堅持想要學好吉他,堅持非常重要,如果想要變得優秀而不實打打醬油,三分鐘熱度,那麼就需要堅持,吉他入門其實並不難,但是多多少少還是得付出一些努力才能獲得回報,不然,輕易就學會的東西就不會那麼吸引人了。
  • 專欄 | pytorch入門總結指南(1)
    考慮到網上的入門教程多且雜,還是打算自己好好整理一下,系統性的學習一下pytroch。https://github.com/bharathgs/Awesome-pytorch-list總結內容包括了,github上的各類高星tutorial(其實內容上基本差不多大同小異的),pytorch中文手冊,《deep learning with pytorch》《深度學習框架pytorch快速開發與實戰》,《深度學習入門之torch》以及官方文檔,說老實話
  • pytorch學習筆記(2):在 MNIST 上實現一個 cnn
    我們會基於上一篇文章中的分類器,來討論實現一個 CNN,需要在之前的內容上做出哪些升級。在前面我要先說一下,這個系列是為了讓大家對 pytorch 從入門到熟悉,對於 deep learning 相關的知識我們不會花費過多的內容去介紹。如果大家對一些 DL 的基礎相關知識不懂的話,推薦幾個資源去學習:所以我們在筆記中對於一些相關的知識就不做深入介紹了。
  • 寫給純小白的深度學習環境搭建寶典:pytorch+tensorflow
    本文將手把手帶你快速搭建你自己的深度學習環境,然後實現自己的第一個深度學習程序。野蠻智能,小白也能看懂的人工智慧。如果你對循環神經網絡的基本原理還不了解,可以通過小編的小編強烈建議為pytorch建立一個虛擬環境,這樣做的好處是方便我們同時使用多個深度學習框架,每個框架就對應一個虛擬環境,框架之間可以互不幹擾。具體步驟:Windows用戶搜索打開Anaconda Prompt,然後輸入:source create -n pytorch python=3.5,pytorch是這個虛擬環境的名字,你也可以給它起個別的名字,Python的版本我們也可以指定為3.6。
  • 《PyTorch中文手冊》來了
    本書提供PyTorch快速入門指南並與最新版本保持一致,其中包含的 Pytorch 教程全部通過測試保證可以成功運行。PyTorch 是一個深度學習框架,旨在實現簡單靈活的實驗。這是一本開源的書籍,目標是幫助那些希望和使用 PyTorch 進行深度學習開發和研究的朋友快速入門,其中包含的 Pytorch 教程全部通過測試保證可以成功運行。
  • onnx實現對pytorch模型推理加速
    對於硬體供應商來說,也可以簡化神經網絡計算的複雜度,實現優化算法。《美團機器學習實踐》_美團算法團隊.pdf《深度學習入門:基於Python的理論與實現》高清中文PDF+源碼特徵提取與圖像處理(第二版).pdfpython就業班學習視頻,從入門到實戰項目2019最新《PyTorch
  • pytorch專題前言 | 為什麼要學習pytorch?
    2.為什麼要學習pytorch呢?3.學習了pytorch我怎麼應用呢?4.按照什麼順序去學習pytorch呢?5.網上那麼多資料如何選擇呢?現在開始逐一的對以上問題提出自己的看法,可能想的不夠周全,歡迎討論區一起探討!1.生物學科的朋友需要學編程麼?需要!
  • Python快速入門的方法
    現在如果有人問:要把哪門語言作為入門的首選語言?不少人都會回答:Python!因為Python簡單,所以學起來快,有編程經驗的程式設計師一周就能上手Python。但是!Python對有基本的程序概念的人來說很簡單,但對於新手來說真不一定算簡單。