10分鐘快速入門PyTorch (1)

上一篇教程我們基本的介紹了pytorch裡面的操作單元,Tensor,以及計算圖中的操作單位Variable,相信大家都已經熟悉了,下面這一部分我們就從兩個最基本的機器學習,線性回歸以及logistic回歸來開始建立我們的計算圖進行運算。

n

由於這個系列文章主要是將pytorch教程的,所以每個演算法的太多數學背景以及推導過程就不再細講了,需要的同學可以自己找相應的教材去了解,什麼統計學習方法,prml,周志華的西瓜書以及機器學習實戰都可以了解到相應內容。

n

線性回歸

n

對於線性回歸,相信大家都很熟悉了,各種機器學習的書第一個要講的內容必定有線性回歸,這裡簡單的回顧一下什麼是簡單的一元線性回歸。即給出一系列的點,找一條直線,使得這條直線與這些點的距離之和最小。

上面這張圖就簡單地描繪出了線性回歸的基本原理,下面我們重點講講如何用pytorch寫一個簡單的線性回歸。

n

code

n

data

n

首先我們需要給出一系列的點作為線性回歸的數據,使用numpy來存儲這些點。

n

x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],n [9.779], [6.182], [7.59], [2.167], [7.042],n [10.791], [5.313], [7.997], [3.1]], dtype=np.float32)nny_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],n [3.366], [2.596], [2.53], [1.221], [2.827],n [3.465], [1.65], [2.904], [1.3]], dtype=np.float32)n

n

顯示出來就是這個樣子

還記得pytorch裡面的基本處理單元嗎?Tensor,我們需要將numpy轉換成Tensor,如果你還記得上一節的內容,那麼你就一定記得這個函數,torch.from_numpy()

n

x_train = torch.from_numpy(x_train)nny_train = torch.from_numpy(y_train)n

n

這樣我們的數據就轉換成了Tensor。

n

model

n

上一節講了基本的模型框架,按照這個框架就可以寫出一個線性回歸模型了

n

class LinearRegression(nn.Module):n def __init__(self):n super(LinearRegression, self).__init__()n self.linear = nn.Linear(1, 1) # input and output is 1 dimensionnn def forward(self, x):n out = self.linear(x)n return outnmodel = LinearRegression()n

n

這裡的nn.Linear表示的是 y=w*x+b,裡面的兩個參數都是1,表示的是x是1維,y也是1維。當然這裡是可以根據你想要的輸入輸出維度來更改的,之前使用的別的框架的同學應該很熟悉。

n

然後需要定義loss和optimizer,就是誤差和優化函數

n

criterion = nn.MSELoss()noptimizer = optim.SGD(model.parameters(), lr=1e-4)n

n

這裡使用的是最小二乘loss,之後我們做分類問題更多的使用的是cross entropy loss,交叉熵。優化函數使用的是隨機梯度下降,注意需要將model的參數model.parameters()傳進去讓這個函數知道他要優化的參數是那些。

n

train

n

接著開始訓練

n

num_epochs = 1000nfor epoch in range(num_epochs):n inputs = Variable(x_train)n target = Variable(y_train)nn # forwardn out = model(inputs) # 前向傳播n loss = criterion(out, target) # 計算lossn # backwardn optimizer.zero_grad() # 梯度歸零n loss.backward() # 方向傳播n optimizer.step() # 更新參數nn if (epoch+1) % 20 == 0:n print(Epoch[{}/{}], loss: {:.6f}.format(epoch+1,n num_epochs,n loss.data[0]))n

n

第一個循環表示每個epoch,接著開始前向傳播,然後計算loss,然後反向傳播,接著優化參數,特別注意的是在每次反向傳播的時候需要將參數的梯度歸零,即

n

optimzier.zero_grad()n

n

validation

n

訓練完成之後我們就可以開始測試模型了

n

model.eval()npredict = model(Variable(x_train))npredict = predict.data.numpy()n

n

特別注意的是需要用 model.eval(),讓model變成測試模式,這主要是對dropout和batch normalization的操作在訓練和測試的時候是不一樣的

n

最後可以得到這個結果

以及loss的結果

ok,在這篇文章中我們使用pytorch實現了簡單的線性回歸模型,掌握了pytorch的一些基本操作,下一節我們將使用logistic回歸對MNIST手寫字體數據集做識別。

n

本文代碼已經上傳到了github上

n

歡迎查看我的知乎專欄,深度煉丹

n

歡迎訪問我的博客


推薦閱讀:

【預測演算法】01. 線性回歸原理及R語言實現
廣義線性模型(Generalized Linear Model)
線性回歸建模中殘差異方差性的分析和處理
【譯文】R語言線性回歸入門

TAG:线性回归 | PyTorch | tutorial |