學習使用pytorch構建線性回歸模型

2021-10-07 18:58:34 字數 3324 閱讀 1192

import torch

import torch.utils.data as data

import torch.nn as nn

import torch.optim as optim

import numpy as np

'''nn是neural networks,定義了大量神經網路的層。核心資料結構是module

'''#整乙個線性模型:y = w1*x1 + w2*x2 + b

#1. 生成資料集

num_inputs = 2 #輸入引數的數量

num_examples = 1000 #要生成的資料個數

lr = 0.03 #學習率

batch_size = 10 #取的時候一批10個

true_w = [0.6,-0.5] #真實權值

true_b = 2.2

features = torch.tensor(np.random.normal(loc=0,scale=1,size=(num_examples,num_inputs)),dtype=torch.float) #1000行2列,均值0,標準差1

labels = true_w[0] * features[:,0] + true_w[1] * features[:,1] + true_b

#2. 分批次讀取資料

dataset = data.tensordataset(features,labels)

data_iter = data.dataloader(dataset,batch_size,shuffle=true)#迭代器

# for x,y in data_iter:

# print(x,y)

#3. 定義模型,方法一

class linearnet(nn.module):

def __init__(self, n_feature):

# super(linearnet,self) 首先找到 linearnet 的父類,然後把類 linearnet 的物件轉換為父類nn.module的物件

super(linearnet, self).__init__() #呼叫module的初始化linear

self.linear = nn.linear(n_feature, 1) #n_feature個輸入,1個輸出

def forword(self,x):

y = self.linear(x)

return y

net = linearnet(num_inputs) #這裡的和下面使用sequential模型不一樣,這裡只是定義了一層,不是整個網路,所以不能用net[0]

print(net)

for param in net.parameters(): #檢視課學習的引數,下面可以設定自己想要的

print(param)

'''#定義模型,方法二,使用sequential

#寫法1

net2 = nn.sequential(

nn.linear(num_inputs,1)

#這裡還可以傳入其它層

)#寫法2

net3 = nn.sequential()

net3.add_module('linear11',nn.linear(num_inputs,1))

#寫法3

from collections import ordereddict

net4 = nn.sequential(ordereddict([

('linear',nn.linear(num_inputs,1))

#……]))print(net2)

print(net3)

print(net4)

print(net4[0])

'''#4. 初始化模型引數

nn.init.normal_(net.linear.weight,mean=0,std=0.01) #net為一層,賦值為正態分佈

nn.init.constant_(net.linear.bias,val=0)#複製為常量

'''用第二種的比較簡單,但第一種可以操控細節

init.normal_(net[0].weight, mean=0, std=0.01)

init.constant_(net[0].bias, val=0) # 也可以直接修改bias的data

'''for param in net.parameters():

print(param)

#5. 定義損失函式,nn模組定義了很多損失函式

loss = nn.mseloss()

#6. 定義優化演算法

''' 為不同的自網路設定不同的學習率

optimizer =optim.sgd([

# 如果對某個引數不指定學習率,就使⽤最外層的預設學習率

, # lr=0.03

], lr=0.03)

實時調整學習率

for param_group in optimizer.param_groups:

param_group['lr'] *= 0.1 # 學習率為之前的0.1倍

'''optimizer = optim.sgd(net.parameters(),lr=lr)

print(optimizer)

#7.訓練模型

num_epochs = 3 #迭代輪數

for epoch in range(1, num_epochs+1):

for x,y in data_iter: #x是輸入,y是真實值,output是**值

output = net.forword(x) #使用第二種模型實現方法,只需要net[0](x)

l = loss(output, y.view(-1,1)) #把y變成和output一樣的維度

optimizer.zero_grad() #梯度清零 等於net.zero_grad()

l.backward() #自動梯度下降(用了這個之後,每個變數就可以得到梯度x.grad)

optimizer.step() #優化

print('epoch %d, loss: %f' % (epoch, l.item()))

#檢測模型

print(net.linear.weight)

print(net.linear.bias)

print("error ",end="")

print(torch.tensor(true_w) - net.linear.weight)

print("error ",end="")

print(torch.tensor(true_b)-net.linear.bias)

使用pytorch構建神經網路

介紹 從學習神經網路到現在時間也不短了,由於個人數學能力有限,用numpy構建神經網路,實屬力不從心,但還是將神經網路的基本步驟理清了,然後開始學習用pytorch搭建神經網路。以下記錄構建神經網路的簡單方法。import numpy as np import torch n,d in,h,d ou...

Pytorch 通過pytorch實現線性回歸

linear regression 線性回歸是分析乙個變數與另外乙個 多個 變數之間關係的方法 因變數 y 自變數 x 關係 線性 y wx b 分析 求解w,b 求解步驟 1.確定模型 2.選擇損失函式 3.求解梯度並更新w,b 此題 1.model y wx b 下為 實現 import tor...

pytorch學習筆記3 線性回歸

線性回歸線性回歸 是分析乙個變數與另外乙個 多 個變數之間關係的方法 因變數 y 自變數 x 關係 線性 y wx b 求解w,b 求解步驟 1.確定模型 module y wx b 2.選擇損失函式 mse 均方差等 3.求解梯度並更新w,b w w lr w.grad b b lr w.grad...