环境配置
摘要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], dtype=torch.float32 )
将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)预测曲线进行绘图,可视化数据拟合情况