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

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

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※產品缺大量曝光嗎?你需要的是一流包裝設計!

您可能也會喜歡…