import random
import torch
import torchvision
import matplotlib.pyplot as plt
from torch import nn
#构造人造数据集
def synthetic_data(w,b,num_examples):
x=torch.normal(0,1,(num_examples,len(w)))
y=torch.matmul(x,w)+b
y+=torch.normal(0,0.01,y.shape)
return x,y.reshape((-1,1))
true_w=torch.tensor([2,-3.4])
true_b=4.2
features,labels=synthetic_data(true_w,true_b,1000)
#读取小批量样本
def data_iter(batch_size,features,labels):
num_examples=len(features)
index=list(range(num_examples))
random.shuffle(index)
for i in range(0,num_examples,batch_size):
batch_index=torch.tensor(index[i:min(i+batch_size,num_examples)])
yield features[batch_index],labels[batch_index]
batch_size=10
#初始化参数w,b
w=torch.normal(0,0.01,size=(2,1),requires_grad=True)
b=torch.zeros(1,requires_grad=True)
def liner(x,w,b):
"""线性回归模型"""
return torch.matmul(x,w)+b
#均方误差
def squared_loss(y_hat,y):
return(y_hat-y.reshape(y_hat.shape))**2/2
def sgd(params,lr,batch_size):
"""小批量随机梯度下降"""
with torch.no_grad():
for param in params:
param-=lr*param.grad/batch_size
param.grad.zero_()
lr=0.03
num_epochs=3
net=liner
loss=squared_loss
for epoch in range(num_epochs):
for x,y in data_iter(batch_size,features,labels):
l=loss(net(x,w,b),y)
l.sum().backward()
sgd([w,b],lr,batch_size)
with torch.no_grad():
train_l=loss(net(features,w,b),labels)
print(epoch+1,'{}'.format(train_l.sum())) #打印每轮的loss
线性回归实现李沐
最新推荐文章于 2024-09-27 10:11:28 发布