Pytorch手册

本文详细介绍了PyTorch的核心组件和功能,包括Tensor计算、自动微分、神经网络模块、优化器、数据加载以及常用操作。讨论了如何利用GPU加速、张量操作如clamp()、gather()、max(),以及torch.nn模块中的线性层、卷积层和激活函数。同时,还涵盖了数据预处理、损失函数、学习率调度器和数据加载器的使用。
摘要由CSDN通过智能技术生成

PyTorch 主要提供以下两大特色:

  • 支持强力GPU加速的Tensor计算能力
  • 基于tape的具有自动微分求导能力的深度神经网络框架

PyTorch 主要包含以下组成要素:

组成要素 描述说明
torch 一个类似于numpy的tensor哭, 提供强力的GPU支持
torch.autograd 一个基于tape的具有自动微分求导能力的库, 可以支持几乎所有的tesnor operatioin
torch.nn 一个神经网络库, 与autograd深度整合, 可以提供最大限度的灵活性
torch.multiprocessing Python的多线程处理, 可以提供torch Tensors之间的内存共享, 对于加载数据和Hogwild training来说十分有用
torch.utils 一些功能类和函数, 如DataLoader, Trainer等等
torch.legacy(.nn/.optim) 为了兼容性而存在的一些代码和实现

Pytorch通常可以作为以下用途使用:

  • 为了使用GPUs性能的numpy替代品
  • 可以提供强大灵活力和速度优势的深度学习平台.

    torch

    backends.cudnn

    1
    
    torch.backends.cudnn.benchmark = True
    

上述设置可以让内置的cudnn的auto-tuner自动寻找最合适当前配置的搞笑算法, 来达到优化运行效率的目标, 在使用时, 应该遵循以下两个准则:

  1. 如果网络的输入数据维度或类型上变化不大, 则该设置可以增加运行效率
  2. 如果网络的输入数据在每次的iteration中都变化的话, 会导致cudnn每次都寻找一遍最优配置, 这样反而 会降低 运行效率.

    torch.cat()

    1
    
    torch.cat(seq, dim=0, out=None) # 返回连接后的tensor
    

将给定的 tensor 序列 seq 按照维度连接起来. 默认维度为0, 说明会将其在第 0 个维度上进行拼接.(最后的结果是第 0 维度增大, 例如三个2行3列的 tensor 按照第0维度拼接, 最后得到的 tensor 维度为6行3列)

clamp()/clamp_()

1
torch.clamp(input, min, max, out=None) -> Tensor

将input里面元素全部划分到[min,max]区间内, 小于min的置为min, 大于max的置为max. 如果不指定min或者max,则认为无下界或上界
其他调用形式:

1
torch.Tensor(min, max) # 调用tensor为input, 返回值为out

device()

1
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

gather()

1
torch.gather(input, dim, index, out=None) -> Tensor

沿着dim指定的轴按着index指定的值重新组合成一个新的tensor.

1
2
3
out[i][j][k] = input[index[i][j][k]][j][k]  # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k]  # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]]  # if dim == 2

即假设input是一个 n 维的tensor, 其 size 为 (x0,x1,…,xi−1,xi,xi+1,…,xn−1), 若dim=i, 则 index 必须也是一个 n 维的tensor, 其 size 为 (x0,x1,…,xi−1,y,xi+1,…,xn−1), 其中 y≥1, 而返回的 tensor out 的 size 和 index 的 size 相同.
一句来说 gather 的作用就是, 在指定的维度上筛选给给定下标index指示的值, 其他值舍弃.
一个例子说明:
scores是一个计算出来的分数,类型为[torch.FloatTensor of size 5x1000]
而y_var是正确分数的索引,类型为[torch.LongTensor of size 5]
容易知道,这里有1000个类别,有5个输入图像,每个图像得出的分数中只有一个是正确的,正确的索引就在y_var中,这里要做的是将正确分数根据索引标号提取出来。

1
2
scores = model(X_var)  # 分数
scores = scores.gather(1, y_var.view(-1, 1)).squeeze()  #进行提取

提取后的scores格式也为[torch.FloatTensor of size 5]
这里讲一下变化过程:

  1. 首先要知道之前的scores的size为[5,1000],而y_var的size为[5],scores为2维,y_var为1维不匹配,所以先用view将其展开为[5,1]的size,这样维数n就与scroes匹配了。
  2. 接下来进行gather,gather函数中第一个参数为1,意思是在第二维进行汇聚,也就是说通过y_var中的五个值来在scroes中第二维的5个1000中进行一一挑选,挑选出来后的size也为[5,1],然后再通过squeeze将那个一维去掉,最后结果为[5].
    Tensor形式
    1
    
    torch.Tensor.gather(dim, index) -> Tensor
    

torch.ge()

torch.gt()

1
torch.gt(input, other, out=None) # -> Tensor

根据 input 和 other 的值返回一个二值 tensor, 如果满足大于条件则为1, 不满足则为0.
other 可以是能够转换成 input size 的tensor, 也可以是一个 float 标量.

torch.index_select()

1
torch.index_select(input, dim, index, out=None) # -> Tensor

返回在 dim 维度上的 index 指明的下标组成的 tensor.
返回的 tensor 的维度的数量和 input 是相同的, 但是第 dim 维度的 size 会和 index size大小相同. 其他维度的 size 保持不变.

torch.le()

1
torch.le(input, other, out=None) # ->Tensor

按元素计算 input≤other.

max()

1
2
3
torch.max(input) # 返回一个Tensor, 代表所有元素中的最大值

torch.max(input,dim,keepdim=False,out=None) # 返回一个元组:(Tensor, LongTensor)

第二种形式会返回一个元组, 元组内元素类型为: (Tensor, LongTensor), 其中, 前者代表对应 dim 上 reduce 后的最大值, 后者代表最大值在维度 dim 中对应的下标.
如果keepdim=True, 则输出的 tensor 的 size 会和输入的相同, 只不过对应 dim 维度上的size为1. 否则, 对应 dim 维度会被 squeeze/reduce, 使得输出的维度比输入的维度少1.

1
2
3
4
5
6
7
8
>>> a = torch.randn(4, 4)
>>> a
tensor([[-1.2360, -0.2942, -0.1222,  0.8475],
        [ 1.1949, -1.1127, -2.2379, -0.6702],
        [ 1.5717, -0.9207,  0.1297, -1.8768],
        [-0.6172,  1.0036, -0.6060, -0.2432]])
>>> torch.max(a, 1)
(tensor([ 0.8475,  1.1949,  1.5717,  1.0036]), tensor([ 3,  0,  0,  1]))

mm()

注意, 没有torch.mm_版本

1
torch.mm(mat1, mat2, out=None) # 返回值为Tensor, 也可以使用out记录返回值

两矩阵相乘, 矩阵的size需要满足乘法规则
其他调用形式:

1
torch.Tensor(mat2) # 调用者为mat1
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值