pytorch学习 02 线性回归

5 线性回归

一个点的梯度值:这个函数变化最快的地方

沿着梯度值的反方向,走学习率的步长,找到w和b的最小值

import torch
import numpy as np 
from torch.autograd import Variable
import matplotlib.pyplot as plt
%matplotlib inline
torch.manual_seed(2023)#设置CPU生成随机数的种子,方便下次复现实验结果

#读入数据x和y
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
                    [9.779], [6.182], [7.59], [2.167], [7.042],
                    [10.791], [5.313], [7.997], [3.1]], dtype=np.float32)

y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],
                    [3.366], [2.596], [2.53], [1.221], [2.827],
                    [3.465], [1.65], [2.904], [1.3]], dtype=np.float32)

plt.plot(x_train,y_train,'bo')
plt.show()

image-20231008172347410

x_train = torch.Tensor(x_train)
y_train = torch.Tensor(y_train)

#参数w和b的定义
w = Variable(torch.randn(1),requires_grad=True)#随机选择数目进行初始化
b = Variable(torch.zeros(1),requires_grad=True)#使用0进行初始化

#构建线性回归模型
x_train = Variable(x_train)
y_train = Variable(y_train)

def linear_model(x):
  return x*w+b

y_ = linear_model(x_train)

#先画出计算图,当前优化的差距还有点大
plt.plot(x_train.data.numpy(), y_train.data.numpy(), 'bo', label='real')
plt.plot(x_train.data.numpy(), y_.data.numpy(), 'ro', label='estimated')
plt.legend()

image-20231008172403173

#定义误差
def get_loss(y_,y):
  return torch.mean((y_-y)**2)
loss = get_loss(y_,y_train)

print(loss)

计算各个项目的梯度

#自动求导
loss.backward()
print(w.grad)
print(b.grad)

#更新参数
w.data = w.data - 1e-2*w.grad.data
b.data = b.data - 1e-2*b.grad.data

y = linear_model(x_train)
plt.plot(x_train.data.numpy(),y_train.data.numpy(),'bo',label='real')
plt.plot(x_train.data.numpy(),y_.data.numpy(),'ro',label='estimated')
plt.legend()

image-20231008172420200

# 多次运行后的结果
for e in range(10):
  y_ = linear_model(x_train)
  loss = get_loss(y_, y_train)

  w.grad.zero_()
  b.grad.zero_()
  loss.backward()

  w.data = w.data - 1e-2 * w.grad.data # 更新 w
  b.data = b.data - 1e-2 * b.grad.data # 更新 b 
  print('epoch:{},loss:{}'.format(e,loss.data))#0.5版本后就不能用loss.data[0]了
y_ = linear_model(x_train)
plt.plot(x_train.data.numpy(), y_train.data.numpy(), 'bo', label='real')
plt.plot(x_train.data.numpy(), y_.data.numpy(), 'ro', label='estimated')
plt.legend()
print(w,b)

image-20231008172452109