使用Pytorch實現簡單的線性迴歸

import torch

import numpy as np


#生成數據
num_inputs=2
num_examples = 1000
true_w = [2,-3.4]
true_b = 4.2
features = torch.tensor(np.random.normal(0,1,(num_examples,num_inputs)),dtype=torch.float)

#labels=X*w+b

labels = true_w[0]*features[:,0] + true_w[1]*features[:,1] + true_b
labels += torch.tensor(np.random.normal(0,0.01,size=labels.size()),dtype=torch.float)

#讀取數據
import torch.utils.data as Data

batch_size = 10

#將訓練數據的特徵和標籤組合,將數據特徵和 數據標籤合併成一行如:x1,x2,x3,y
dataset = Data.TensorDataset(features,labels)

#隨機讀取小批量數據
data_iter = Data.DataLoader(dataset,batch_size,shuffle=True)

for X,y in data_iter:
    # print(X,y)
    break

import torch.nn as nn

class LinearNet(nn.Module):
    def __init__(self,n_feature):
        super(LinearNet,self).__init__()
        self.linear = nn.Linear(n_feature,1)

    #forward 定義前向傳播
    def forward(self, x):
        y = self.linear(x)
        return y

net = LinearNet(num_inputs)
print(net)

#如果可以使用多個網絡形成多個層可以使用Sequential 把單個的網絡按照一定的順序插入到Sequential序列中進行
#使用nn.Sequential來組合網絡層,Sequential是一個有序的容器,網絡層按照轉入的順序加入到計算圖中
#寫法1
net = nn.Sequential(
    nn.Linear(num_inputs,1)
    #其他層
)
#寫法二
net = nn.Sequential()
net.add_module('linear',nn.Linear(num_inputs,1))
#net.add_module...
#寫法三
from collections import OrderedDict
net = nn.Sequential(OrderedDict([('linear',nn.Linear(num_inputs,1))
                                 #......
                                 ]))
print(net)
print(net[0])

#獲取訓練模型的可學習的參數
#通過net.parameters()查看模型所有可學習的參數,返回一個生成器
for param in net.parameters():
    print(param)

#初始化模型參數

from torch.nn import init
init.normal_(net[0].weight,mean=0,std=0.01)
init.constant_(net[0].bias,val=0) #也可以直接的修改bias的data:net[0].bias.data.dill_(0)

#使用modal中提供的損失函數
#定義損失函數
loss=nn.MSELoss()

#進行優化訓練
#實現一個學習率爲0.03的小批量隨機梯度下降SGD
import torch.optim as optim
optimizer = optim.SGD(net.parameters(),lr=0.03)
print(optimizer)

#爲不同的子網絡設置不同的學習率
# optimizer = optim.SGD([
#     #如果對某個參數不指定學習率,就使用最外層的默認學習率
#     {'params':net.subnet1.parameters()},
#     {'params':net.subnet2.parameters(),'lr':0.01}
#     ],lr=0.03)

#調整學習率
for param_group in optimizer.param_groups:
    param_group['lr']*=0.1

#訓練模型
num_epochs = 3
for epoch in range(1,num_epochs+1):
    for X,y in data_iter:
        output = net(X)
        l = loss(output,y.view(-1,1))
        optimizer.zero_grad()   # 梯度清零,等價於net.zero_grad()
        l.backward()
        optimizer.step()
    print('epoch %d,loss:%f'%(epoch,l.item()))

dense = net[0]
print(true_w,dense.weight)
print(true_b,dense.bias)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章