ErikTse Runtime

  • 首页 / Home
  • | 算法学习 / Algorithm
    • 所有 / All
    • 简单 / Easy
    • 中等 / Medium
    • 困难 / Hard
  • | 技术分享 / Technology
    • 所有 / All
    • 网络技术 / NetWork
    • 资源共享 / Resource
    • 项目实践 / Event
  • ETOJ在线评测系统
Keep Going.
温故而知新.
  1. 首页
  2. 技术分享
  3. 学科学习
  4. 正文

[Pytorch]机器学习入门项目笔记:利用优化器和自动微分构建神经网络实现线性回归(4)

2022年9月2日 123点热度 0人点赞 0条评论

上一节《[Pytorch]机器学习入门项目笔记:手动实现线性回归(3)》写过手动实现线性回归,其实是半自动啦,因为使用了自动微分,但是却没有自动优化,也没有神经网络。只有单个的w和b,这样的网络容易出现过拟合或者无法拟合的问题,这一节写一下利用NN(神经网络)来实现线性回归。

首先引入需要的库文件

import torch
from torch import nn
from torch import optim
from matplotlib import pyplot as plt  # 用于画图

定义数据

# 1. 定义数据
x = torch.rand([50, 1])
y = x * 3.2 + 2.1

这一步是创建出两个tensor,x是一个50 x 1的列向量,每个元素取值范围是[0, 1],y就是根据表达式得出的一个50 x 1的列向量。

定义模型

# 2 .定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        return self.linear(x)

这里定义了一个简单的线性层,只有一个神经元,一个输入一个输出。

也就是传入一个参数x,输出w * x + b。

定义self.linear时无需设置参数requires_grad,默认为True。

将各个工具实例化

# 3. 实例化模型,loss,和优化器
model = Net()

# 损失函数
criterion = nn.MSELoss()

# 优化器
optimizer = optim.SGD(model.parameters(), lr=1e-3)

解释其中的一些参数:

MSELoss()是一个均方损失函数\(loss(x,y)=(x−y)^2\)。

optim.SGD表示使用梯度下降的优化器,model.parameters()获取被跟踪的变量,加入到优化器中,会在后续的训练中优化,lr是学习率。

训练模型

# 4. 训练模型
for i in range(50000):
    out = model(x)  # 4.1 获取预测值
    # out 和 y都是一个50 x 1的tensor张量
    loss = criterion(y, out)  # 4.2 计算损失
    optimizer.zero_grad()  # 4.3 梯度归零
    loss.backward()  # 4.4 计算梯度
    optimizer.step()  # 4.5 更新梯度
    if (i + 1) % 20 == 0:  # 每20次训练输出一次
        print('Epoch[{}/{}], loss: {:.6f}'.format(i, 50000, loss.data))

每次通过传入x到model里,得到一个预测的tensor,也就是out,再将out放入criterion得到损失,将梯度归零后反向传播得到所有变量的梯度,再通过optimizer.step()进行梯度更新。

评估模型并绘图

# 5. 模型评估、画图
predict = model(x)
plt.scatter(x.data.numpy(), y.data.numpy(), c="r")
plt.plot(x.data.numpy(), predict.data.numpy())
plt.show()


# 输出w和b
for name, parameters in model.named_parameters():
    print(name, float(parameters))

这个就没啥好说的了。

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: critierion optimizer python 深度学习 神经网络
最后更新:2022年9月2日

Eriktse

18岁,性别未知,ACM-ICPC现役选手,ICPC亚洲区域赛银牌摆烂人,CCPC某省赛铜牌蒟蒻,武汉某院校计算机科学与技术专业本科在读。

点赞
< 上一篇
下一篇 >

文章评论

取消回复

Eriktse

18岁,性别未知,ACM-ICPC现役选手,ICPC亚洲区域赛银牌摆烂人,CCPC某省赛铜牌蒟蒻,武汉某院校计算机科学与技术专业本科在读。

文章目录
  • 首先引入需要的库文件
  • 定义数据
  • 定义模型
  • 将各个工具实例化
  • 训练模型
  • 评估模型并绘图

友情链接 | 站点地图

COPYRIGHT © 2022 ErikTse Runtime. ALL RIGHTS RESERVED.

Theme Kratos | Hosted In TENCENT CLOUD

赣ICP备2022001555号-1

赣公网安备 36092402000057号