10分鐘快速入門PyTorch (1)
上一篇教程我們基本的介紹了pytorch裡面的操作單元,Tensor,以及計算圖中的操作單位Variable,相信大家都已經熟悉了,下面這一部分我們就從兩個最基本的機器學習,線性回歸以及logistic回歸來開始建立我們的計算圖進行運算。
n由於這個系列文章主要是將pytorch教程的,所以每個演算法的太多數學背景以及推導過程就不再細講了,需要的同學可以自己找相應的教材去了解,什麼統計學習方法,prml,周志華的西瓜書以及機器學習實戰都可以了解到相應內容。
n線性回歸
n
對於線性回歸,相信大家都很熟悉了,各種機器學習的書第一個要講的內容必定有線性回歸,這裡簡單的回顧一下什麼是簡單的一元線性回歸。即給出一系列的點,找一條直線,使得這條直線與這些點的距離之和最小。
上面這張圖就簡單地描繪出了線性回歸的基本原理,下面我們重點講講如何用pytorch寫一個簡單的線性回歸。
ncode
n
data
n
首先我們需要給出一系列的點作為線性回歸的數據,使用numpy來存儲這些點。
nx_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()
nx_train = torch.from_numpy(x_train)nny_train = torch.from_numpy(y_train)n
n
這樣我們的數據就轉換成了Tensor。
nmodel
n
上一節講了基本的模型框架,按照這個框架就可以寫出一個線性回歸模型了
nclass 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,就是誤差和優化函數
ncriterion = nn.MSELoss()noptimizer = optim.SGD(model.parameters(), lr=1e-4)n
n
這裡使用的是最小二乘loss,之後我們做分類問題更多的使用的是cross entropy loss,交叉熵。優化函數使用的是隨機梯度下降,注意需要將model的參數model.parameters()傳進去讓這個函數知道他要優化的參數是那些。
ntrain
n
接著開始訓練
nnum_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,然後反向傳播,接著優化參數,特別注意的是在每次反向傳播的時候需要將參數的梯度歸零,即
noptimzier.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語言線性回歸入門