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

pytorch入門2.x構建迴歸模型系列:
pytorch入門2.0構建迴歸模型初體驗(數據生成)
pytorch入門2.1構建迴歸模型初體驗(模型構建)
pytorch入門2.2構建迴歸模型初體驗(開始訓練)html

通過上面兩個部分,咱們完成了數據生成、網絡結構定義,下面咱們終於能夠小試牛刀,訓練模型了!
首先,咱們先定義一些訓練時要用到的參數:python

EPOCH = 1000  # 就是要把數據用幾遍
LR = 0.1  # 優化器的學習率,相似登山的時候應該邁多大的步子。
# BATCH_SIZE=50

其次,按照定義的模型類實例化一個網絡:git

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的值的意義。github

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函數

相關文章
相關標籤/搜索