1. 程式人生 > >pytorch入門2.2構建迴歸模型初體驗(開始訓練)

pytorch入門2.2構建迴歸模型初體驗(開始訓練)

pytorch入門2.x構建迴歸模型系列: [pytorch入門2.0構建迴歸模型初體驗(資料生成)](https://www.cnblogs.com/datasnail/p/13082298.html) [pytorch入門2.1構建迴歸模型初體驗(模型構建)](https://www.cnblogs.com/datasnail/p/13088432.html) [pytorch入門2.2構建迴歸模型初體驗(開始訓練)](https://www.cnblogs.com/datasnail/p/13088705.html) 經過上面兩個部分,我們完成了資料生成、網路結構定義,下面我們終於可以小試牛刀,訓練模型了! 首先,我們先定義一些訓練時要用到的引數: ```python EPOCH = 1000 # 就是要把資料用幾遍 LR = 0.1 # 優化器的學習率,類似爬山的時候應該邁多大的步子。 # BATCH_SIZE=50 ``` 其次,按照定義的模型類例項化一個網路: ```python 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的值的意義。 ```python 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)次,應該差不多了。是時候看看訓練的咋樣啦!其實我們已經知道訓練的咋樣了,就是上面輸出的損失值,只不過是在訓練集上的。 下面我們就要看看在測試集上表現咋樣呢? ```python 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() ``` ![](https://img2020.cnblogs.com/blog/1023513/202006/1023513-20200610203741700-221119073.png) 看看圖,結果還湊合吧,要想結果更好需要進一步對模型的結構、超引數進行設定,我們之後在學。 到此為止,我們用pytorch就已經建立完,並且訓練完一個線性迴歸模型了,我們可以回顧下,多看幾遍,仔細回想一下這裡面到底發生了什麼。 完整的程式碼地址如下:[github](https://github.com/dataSnail/blogCode/blob/master/pytorch/linea