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...