【pytorch学习笔记】01-安装与基础使用

pytorch安装&使用

  • 简单、高效、扩展性好
  • 在学术研究领域较多

安装

  • 安装python
  • 查看电脑配置,按自己的需求选择对应版本(cpu,gpu,python版本等)
  • 使用指令 复制Run this Command内容执行即可
    在这里插入图片描述

pytorch基础知识

张量

  • pytorch基本运算单元,与数学上的使用,内容有不同
  • 0阶为scalar,1阶为vector,二阶为matrix
  • 其本质是一种多重线性映射关系,坐标分布在多维空间内,拥有多个分量的量。
pytorch中的使用
  • 存储和变换数据的主要工具
  • 和numpy非常相似,但提供GPU计算和自动梯度等功能
tensor创建
import torch
#常见Tensor创建方式
## 快速初始化
###创建全0or1\对角矩阵,可使用dtype进行类型设置,默认为float
t1 = torch.zeros(4,3,dtype=torch.int)
t2 = torch.ones(4,3)
t3 = torch.eye(4,4)
t4 = torch.rand(4,3)#随机 rand服从均匀分布,randn服从标准正态分布
# print(t1,t2,t3,t4)
###直接构建
t1 = torch.Tensor(6,4,5)#按搞定的尺寸构建,3个维度(6,4,5)
t2 = torch.tensor([5.5,3])#按数据构建
# print(t1,t2)
### 函数构建
t1 = torch.arange(0,10,2)#从0-9,步长为1构建,默认为1
t2 = torch.linspace(0,10,5)#从0-10,均分为2块
t3 = torch.normal(mean=0.5,std=torch.arange(1.,6.))#生成正态分布张量
t4 = torch.randperm(7)#生成0-7的随机排列tensor
# print(t4)
###基于已有的tensor创建新的tensor
t1 = t1.new_ones(4,3)#与旧的tensor具有相同的dtype和device
# print(t1)
t1 = torch.randn_like(t1,dtype=torch.float)#重置数据类型与数据
print(t1)
print(t1.size(),t1.shape)#查看尺寸
tensor操作
#张量的相关操作
##加法
y = torch.randn(4,3)
x = torch.randn(4,3)
# print(x+y)#方式1
# print(torch.add(x,y))#方式2
# print(y.add(x))#方式3
##索引 --与numpy基本一致
# print(x[:,1])
##维度转换 view与reshape
x = torch.randn(4,4)
y = x.view(16)#4*4变为1*16 会改变原始张量 reshape不会改变但不能保证输出是拷贝值
z = x.view(-1,8)#-1代表这一维的维数由其他维度决定 此处为2*8
###不影响原始张量
x = torch.randn(4,4)
x2 = x.clone()
print(id(x),id(x2))#克隆副本
### squzee与unsqueeze  删去维数为1的维度/给指定位置增加维数为1的维度
x = torch.unsqueeze(x,2)#指定位置添加维数为1的维度
x = torch.unsqueeze(x,1)
print(x.shape)
x = torch.squeeze(x,1)#去掉指定位置维数为1的维度,不指定位置则全去除
print(x.shape)

tensor广播机制
#广播机制
##两个形状不同的tensor按元素运算时,“可能”触发广播机制
# x = torch.arange(1,5)
# y = torch.arange(1,9).view(4,2)#这样是不会触发的
# print(x)
# print(x+y)

x = torch.arange(1, 3).view(1, 2)
print(x)
y = torch.arange(1, 4).view(3, 1)
print(y)
print(x + y)#这样可以

自动求导

  • 目的:快速求解偏导
  • 神经网络的核心:autograd(为张量上的所有操作提供自动求导机制)
  • tensor中有一个属性为requires_grad,默认为False 设定为True后将追踪对于该张量的所有操作
#autograd包
#1、一个张量只有属性.requires_grad设定为True,才会程序才会追踪对于该张量的所有操作,对于已建立的张量
#使用.requires_grad_()来更改
#2、进行函数计算后z=f(x,y) 使用.backward()就会自动计算所有梯度(注:为标量时不需要传入任何参数)
#3、阻止一个张量被跟踪历史,可以调用.detach()将其与计算历史分离,并阻止它未来的计算记录被跟踪
#还可以被包装在with torch.no_grad():中,防止冗余计算
#4、Function类,与Tensor互相连接生成无环图,编码了完整的计算历史,反应为张量属性:.grad_fn
from __future__ import print_function
import torch
x = torch.randn(3,3,requires_grad=True)
# print(x.grad_fn)
y = x**2
#y.backward()因为不是标量所以不能不加参数
y.backward(gradient=torch.randn(3,3))#如此添加参数
# print(x.grad)
# print(y.dim())
#梯度
#1、每一次反向传播,梯度都会累加之前的梯度
x = torch.ones(2,2,requires_grad=True)
y = x**2
out = (y*y*3).mean()
out.backward()
# print(x.grad)
out1 = x.sum()
out1.backward()
# print(x.grad)
x.grad.data.zero_()#清空积累的梯度
out2 = x.sum()
out2.backward()
# print(x.grad)
##防止跟踪
with torch.no_grad():
    print((x**2).requires_grad)
##希望修改tensor的数值,但又不希望autograd记录
x = torch.ones(1,requires_grad=True)
print(x.data) # 还是一个tensor
print(x.data.requires_grad) # 但是已经是独立于计算图之外
y = 2 * x
x.data *= 100 # 只改变了值,不会记录在计算图,所以不会影响梯度传播
y.backward()
print(x.data) # 更改data的值也会影响tensor的值 
print(x.grad)
##.data与.detach的不同点与相同点
##相同点
###-都和x共享同一块数据
###-都和x的计算历史无关
###-requires_grad=False
##不同点
###-data对数据的保护不及detach

并行计算

  • 目的是提高效率,减少训练时间
  • 涉及cuda的使用,GPU的调用,对于CPU就是进程的调用
常见的方法:
  • 网络结构分布到不同不同的设备中
  • 同一层的任务分布到不同设备中
  • 不同数据分布到不同设备中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值