视频教程:https://www.bilibili.com/video/BV1Y7411d7Ys?p=5

准备数据

首先配置了环境变量,这里使用python3.9.7版本,在Anaconda下构建环境运行,并且安装pytorch

决定使用模型y=wx+b

然后根据视频在pycharm中输入如下代码

import torch
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[2.0],[4.0],[6.0]])

首先这里预期使用小批量梯度下降

而在使用numpy的时候会有广播机制存在,会自动把不能相加的矩阵直接扩充广播成相同大小,而我们的Tensor构造的时候就需要注意了,我们必须要保证我们构造的数据一开始就是矩阵,所以必须用[1.0],[2.0],[3.0]的方法来进行构造

设计模型

在pytorch中目标不再是人工求出导数,重点变成了构造计算图

构造计算图首先要知道X的维度,还需要知道输出的y是几维的,这样就可以确定w权重以及b偏值的形状

这样就可以输入x,经过w和b计算出y,再由y算出算是loss,由loss调用反向传播,拿到所有损失还需要求和求均值,否则无法反向传播

首先要把我们的模型定义成一个类,而我们在构造模型的时候使用的都是这样一个模板,必须掌握这样的一个编写方式

class LinearModel(torch.nn.Module):         //所有编写的模型都要记成Module,这里面有很多方法,要从这个模块里面把继承下来
//类里面至少要有两个函数,一个是init,属于构造函数,还有一个forward函数(必须叫这个),而module里面会根据计算图自动帮你实现反向传播过程,如果你觉得他的计算效率不高,你也可以用torch里面的一个function类来构造自己的计算方法
def __init__(self):
super(LinearModel,self).__init__() //调用父类的构造
self.Linear = torch.nn.Linear(1, 1) //torch.nn.Linear是torch里面的一个类,这里是构造一个对象,这里包含了权重和偏置 def forward(self,x):
y_pred = self.Linear(x) //这里表示实现一个可调用的对象
return y_pred
model1 = LinearModel()

这里给出class torch.nn.Linear的具体文档



这里的size表示维度,这里的bias是一个布尔类型,来决定你是否需要偏置量(默认是ture)

构造损失函数和优化器

criterion = torch.nn.MSELoss(size_average=False)               //size.average表示最后是否需要求均值
optimizer = torch.optim.SGD(model1.parameters(),lr=0.01) //parameters可以把模型中所有的参数全部找出来,lr就是学习率,而这个optimizer,他就知道需要对哪些东西做优化

训练过程

for epoch in range(100):
y_pred = model1(x_data) //先算出y
loss = criterion(y_pred,y_data) //利用criterion算出损失函数
print(epoch, loss.item()) //打印出来 optimizer.zero_grad() //先梯度归零
loss.backward() //反向传播
optimizer.step() //更新参数

打印结果

print('w=', model.linear.weight.item())
print('b=', model.linear.bias.item())
x_test = torch.Tensor([[4.0]])
y_text = model(x_test)
print('y_pred=', y_text.data)

一开始给我报错



原来最上面X,Y赋值少了一对中括号,导致识别不出来

然后成功跑出!



输入4,1000次迭代输出7.9994,很不错了

然后我们修改一下,加一个数据4和8,然后输入10,训练2000次



帅的嘛不谈了!

完整代码如下:

import torch
x_data = torch.Tensor([[1.0], [2.0], [3.0], [4.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0], [8.0]]) class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = torch.nn.Linear(1, 1) def forward(self, x):
y_pred = self.linear(x)
return y_pred model = LinearModel()
criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print(epoch, loss.item()) optimizer.zero_grad()
loss.backward()
optimizer.step() print('w=', model.linear.weight.item())
print('b=', model.linear.bias.item())
x_test = torch.Tensor([[10.0]])
y_text = model(x_test)
print('y_pred=', y_text.data)

打算修改步长再试试

后记:果然学习率设置过程就是炼丹

最新文章

  1. Java中的Socket的用法
  2. js条件判断时隐式类型转换
  3. MVC中使用jquery uploadify上传图片报302错误
  4. 配置MAVEN出现错误:java_home not found in your enviroment
  5. [游戏模版2] Win32最小框架
  6. 工作中常用的Linux命令:目录
  7. iOS开发 Date转字符串
  8. C++中创建对象的时候加括号和不加括号的区别
  9. 在安装MySQL Workbentch的时候出现如下问题,已经解决。
  10. CentOS7安装Python3.5
  11. win10十周年更新后cent os 虚拟机无法连接到xshell
  12. Linux--慕课学习
  13. Android艺术开发探索第四章——View的工作原理(下)
  14. SQL Server 增加链接服务器
  15. [zt]C++二维数组讲解、二维数组的声明和初始化
  16. 消息对话框 MessageBoxButtons
  17. python 全栈开发,Day2(in,while else,格式化输出,逻辑运算符,int与bool转换,编码)
  18. hdu-4738-tarjin/割边
  19. vue路由DEMO
  20. chmod 权限 命令详细用法

热门文章

  1. 多校联训 DP 专题
  2. 记一次重复造轮子(Obsidian 插件设置说明汉化)
  3. 最小生成树 链式前向星 Prim&Kruskal
  4. dubbo(九):timeout超时机制解析
  5. 全网最新的nacos 2.1.0集群多节点部署教程
  6. idea引入fastjson的jar包:ClassNotFound
  7. CF1007A Reorder the Array 题解
  8. StringBuilder的原理
  9. Linux系列之重定向操作
  10. Tomcat启动失败 提示Server Tomcat v7.0 Server at localhost failed to start.六种解决方法