【python】pytorch包(第一章)基础概念

您所在的位置:网站首页 solidworks转2维 【python】pytorch包(第一章)基础概念

【python】pytorch包(第一章)基础概念

#【python】pytorch包(第一章)基础概念| 来源: 网络整理| 查看: 265

环境配置

参考知乎文章

摘要Abstract tensor = torch.tensor( list_name, # 原数据名称 requires_grad=true, #是否计入梯度计算 device="cpu" # torch的运算使用”cpu“还是”cuda“(gpu) )

具体解释见下述正文

一、概念引入:张量 Tensor 1> 定义

就是数据的意思 0 阶张量:0维数据;标量,常数 1 阶张量:1维数据;数组,向量 2 阶张量:2维数据;矩阵,2-D … … N阶张量: N维张量

2> Pytorch中 张量的创建 将原数据转变为张量 import torch Tensor_1 = torch.tensor( 数据变量 ) 使用torch的api创建tensor torch.empty( [a,b] )创建a行b列的空的tensortorch.ones( [a,b] )创建a行b列的 数值全为1 的tensortorch.zeros( [a,b] )创建a行b列的 数值全为0 的tensortorch.rand( [a,b] )创建a行b列的 数值为0~1随机值 的tensortorch.randint( low, high, [a,b] )创建a行b列的 数值为low~high之间的随机整数 的tensor 3> Pytorch中 张量的使用 ① 获取tensor中的数据

a = torch.tensor( [1,2] )将tensor的内容赋值给变量a x = a.item()获取 张量a 中的单个元素 x= a.max()获取 张量a 中元素的最大值 切片与调用: 与数组方法一致,如 a[1,2]表示 张量a的1行2列的值

② 获取tensor的基本属性 –查看tensor的阶数:a. dim( )获取 张量a 的阶数 –查看tensor的形状:a.size()获取 张量a 的形状 –查看tensor的数据类型:a.dtype获取 张量a 的数据类型 –查看tensor的数据内容:a.data只获取张量a的数据内容 –查看tensor的全部参数:a显示张量a的数据内容、全部参数设置等 ③ 张量的形状修改 高维数据 摊开

new_a = a.view( [x,y] )将 张量a 的形状修改为 x行y列 类似于 numpy中的reshape函数,要求保证数据个数一致

二维矩阵转置:

new_a = a.t()将 张量a 进行矩阵转置

高维矩阵转置:

new_a = a.transpose(x,y)将a中的第x阶层和第y阶层视为二维矩阵,然后进行转置 new_a = a.permute(x,y,z)将张量a进行转置,转置规则如下:将原第x阶放在当前的第0阶,原第y阶放在当前的第1阶,原第z阶放在当前的第2阶

④ 数据类型转换 张量转化为numpy数据

a_data_byNumpy = a.detach.numpy()

⑤ 张量的计算

ans = torch.add(x,y)将张量x与张量y中的对应元素相加,生成新的张量ans x.add_(y)将张量y与张量x的对应元素相加,新的张量赋值给x

⑥ 就地修改

下划线结尾的函数表示,直接将该变量原地修改,赋值给自己 如:x.add(y), a.ntranspose_(x,y) 会直接将x和a修改

4> GPU中 张量的使用 判断当前主机是否支持GPU来执行代码

torch.cuda.is_available()

适用于GPU中的张量创建 KEYdevice = torch.device("cuda") KEYdevice = torch.device( "cuda" if torch.cuda.is_availabel() else "cpu" ) #支持就用cuda,不支持就用cpu torch.zeros([2,3],device = KEYdevice) 二、梯度下降与反向传播 1. 梯度

同高等数学的梯度概念,梯度即偏导数最大的方向

2. 反向传播

设:被拟合的关系函数为 y = f( x1,x2,x3… ) 则: dy/dx 为正向导数,计算机猜测dy/dx的关系,从而根据猜测的dy/dx关系推测 y 的预测值 pred_y,根据pred_y 和 y的差距关系得 损失函数 Loss() 的值,以Loss的最值为目标方向,反向调整 dy/dx 的关系。 =>反向传播

3. tensor中的 requires_grad 参数

requires_grad = true 表示 该张量 被计入梯度的计算和考虑, requires_grad = false 表示 该张量 不被计入梯度的计算和考虑

三、用Pytorch手写线性回归

本段用于理解机器学习的逻辑流程

import torch #这是啥??? learning_rate=0.01 # 准备数据 x = torch.rand([500,1]) #500个数据,每个数据都是一维数据 y = x*3 + 0.8 # 设:被拟合曲线为: pred_y = w*x + b w = torch.rand([1,1],requires_grad=True) b = torch.tensor(0,requires_grad=True,dtype=torch.float32) pred_y = torch.matmul(x,w) + b # torch.matmul(a,b) 表示a*b # 设定损失函数 loss = (y-pred_y).pow(2).mean() #方差 # 反向传播 for i in range(5000): #调整requires_grad的参数 if w.grad is not None: w.grad.data.zero_() if b.grad is not None: b.grad.data.zero_() #更新w和b loss.backward()#反向传播 w.data = w.data - learning_rate* w.grad b.data = b.data - learning_rate* b.grad #更新损失函数 与 预测曲线 pred_y = torch.matmul(x,w) + b loss = (y-pred_y).pow(2).mean() #方差 #调试 if i%100 == 0 : print("w,b,loss:",w.item(),b.item(),loss.item()) 五、实例化模型 nn.Module

定义:构建模型 与 调用模型

定义模型的底层逻辑 from torch import nn class Lr(nn.Module): def __init__(self):#必须是两个下划线的长度! super(Lr,self).__init__() #继承父类init的参数 self.linear = nn.Linear(1,1) def forward(self,x): out = self.linear(x) return out 构建模型(模型、loss函数、优化器的实例化)

调用模型基底、设定Loss函数、设定优化器

#模型调用 model = Lr() citerion = nn.MSELoss() optimizer = optim.SGD(model.parameters(),lr=1e-3) 训练模型(对实例化的模型进行训练) #训练模型 training_times = 30000 for i in range(training_times): out = model(x) #模型当前状态的预测值 loss = citeration(y,out) #损失值 optimizer.zero_grad() #梯度归零 loss.backward() #计算梯度 optimizer.step() #更新梯度 if (i-1)%20 == 0: print('Epoch[{}/{}],loss:{:.6f}'.format(i,training_times,loss.data) 预测与评估 model.eval() #使模型进入评估模式/预测模式 #该模式下,输入的新数据不会让模型受到新的训练 pred_y = model(x) #输入自变量x,获得预测值pred_y pred_y = pred_y.data.numpy() #转darray类型 #可将 (x,y)点集以及(pred_y,x)预测曲线进行绘图,可视化数据拟合情况


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3