pytorch入門2.x構建迴歸模型系列:
pytorch入門2.0構建迴歸模型初體驗(資料生成)
pytorch入門2.1構建迴歸模型初體驗(模型構建)
pytorch入門2.2構建迴歸模型初體驗(開始訓練)
經過上面兩個部分,我們完成了資料生成、網路結構定義,下面我們終於可以小試牛刀,訓練模型了!
首先,我們先定義一些訓練時要用到的引數:
EPOCH = 1000 # 就是要把資料用幾遍
LR = 0.1 # 優化器的學習率,類似爬山的時候應該邁多大的步子。
BATCH_SIZE=50
其次,按照定義的模型類例項化一個網路:
if torch.cuda.is_available(): # 檢查機器是否支援GPU計算,如果支援GPU計算,那麼就用GPU啦,快!
model = LinearRegression().cuda() # 這裡的這個.cuda操作就是把模型放到GPU上
else:
model = LinearRegression() # 如果不支援,那麼用cpu也可以哦
# 定義損失函式,要有個函式讓模型的輸出知道他做的對、還是錯,對到什麼程度或者錯到什麼程度,這就是損失函式。
loss_fun = nn.MSELoss() # loss function
# 定義優化器,就是告訴模型,改如何優化內部的引數、還有該邁多大的步子(學習率LR)。
optimizer = torch.optim.SGD(model.parameters(), lr=LR) # opimizer
下面終於可以開始訓練了,但是訓練之前解釋一下EPOCH,比如我們有300個樣本,訓練的時候我們不會把300個樣本放到模型裡面訓練一遍,就停止了。即在模型中我們每個樣本不會只用一次,而是會使用多次。這300個樣本到底要用多少次呢,就是EPOCH的值的意義。
for epoch in range(EPOCH):
# 此處類似前面例項化模型是,我們把模型放到GPU上來跑道理是一樣的。此處,我們要把變數放到GPU上,跑的快!如果不行, 那就放到CPU上吧。
# 其中x是輸入資料,y是訓練集的groundtruth。為什麼要有y呢?因為我們要知道我們算的對不對,到底有多對(這裡由損失函式控制)
if torch.cuda.is_available():
x = Variable(x_train).cuda()
y = Variable(y_train).cuda()
else:
x = Variable(x_train)
y = Variable(y_train)
# 我們把x丟進模型,得到輸出y。哇,是不是好簡單,這樣我們就得到結果了呢?但是不要高興的太早,我們只是把輸入資料放到一個啥都不懂(引數沒有訓練)的模型中,得到的結果肯定不準啊。不準的結果怎麼辦,看下一步。
out = model(x)
# 拿到模型輸出的結果,我們就要看看模型算的準不準,就是計算損失函式了。
loss = loss_fun(out,y)
# 好了好了,我已經知道模型算的準不準了,那麼就該讓模型自己去朝著好的方向優化了。模型,你已經是個大孩子了,應該會自己優化的。
optimizer.zero_grad() # 在優化之前,我們首先要清空優化器的梯度。因為每次迴圈都要靠這個優化器呢,不能翻舊賬,就只算這次我們怎麼優化。
loss.backward() # 優化開始,首先,我們要把算出來的誤差、損失倒著傳回去。(是你們這些模組給我算的這個值,現在這個值有錯誤,錯了這麼多,返回給你們,你們自己看看自己錯哪了)
optimizer.step() # 按照優化器的方式,一步一步優化吧。
if (epoch+1)%100==0: # 中間每迴圈100次,偷偷看看結果咋樣。
print('Epoch[{}/{}],loss:{:.6f}'.format(epoch+1,EPOCH,loss.data.item()))
上面我們訓練了1000(EPOCH=1000)次,應該差不多了。是時候看看訓練的咋樣啦!其實我們已經知道訓練的咋樣了,就是上面輸出的損失值,只不過是在訓練集上的。
下面我們就要看看在測試集上表現咋樣呢?
model.eval() # 開啟模型的測試模式
# 拿到測試集中x的值,放到GPU上
if torch.cuda.is_available():
x = x_test.cuda()
#通過把x的值輸入模型,得到預測結果
predict = model(x)
# 那預測結果的值取出來,因為預測結果是封裝好的,現在h只要它的值。
predict = predict.cpu().data.numpy()
#畫個圖看看,到底擬合成啥樣了?
plt.plot(x.cpu().numpy(),y_test.cpu().numpy(),'ro',label='original data')
plt.plot(sorted(x.cpu().numpy()),sorted(predict),label='fitting line')
plt.show()
看看圖,結果還湊合吧,要想結果更好需要進一步對模型的結構、超引數進行設定,我們之後在學。
到此為止,我們用pytorch就已經建立完,並且訓練完一個線性迴歸模型了,我們可以回顧下,多看幾遍,仔細回想一下這裡面到底發生了什麼。
完整的程式碼地址如下:github