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自动寻找最合适当前配置的搞笑算法, 来达到优化运行效率的目标, 在使用时, 应该遵循以下两个准则:
- 如果网络的输入数据维度或类型上变化不大, 则该设置可以增加运行效率
- 如果网络的输入数据在每次的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_()
|
|
将input里面元素全部划分到[min,max]区间内, 小于min的置为min, 大于max的置为max. 如果不指定min或者max,则认为无下界或上界
其他调用形式:
|
|
device()
|
|
gather()
|
|
沿着dim指定的轴按着index指定的值重新组合成一个新的tensor.
|
|
即假设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中,这里要做的是将正确分数根据索引标号提取出来。
|
|
提取后的scores格式也为[torch.FloatTensor of size 5]
这里讲一下变化过程:
- 首先要知道之前的scores的size为[5,1000],而y_var的size为[5],scores为2维,y_var为1维不匹配,所以先用view将其展开为[5,1]的size,这样维数n就与scroes匹配了。
- 接下来进行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()
|
|
根据 input 和 other 的值返回一个二值 tensor, 如果满足大于条件则为1, 不满足则为0.
other 可以是能够转换成 input size 的tensor, 也可以是一个 float 标量.
torch.index_select()
|
|
返回在 dim 维度上的 index 指明的下标组成的 tensor.
返回的 tensor 的维度的数量和 input 是相同的, 但是第 dim 维度的 size 会和 index size大小相同. 其他维度的 size 保持不变.
torch.le()
|
|
按元素计算 input≤other.
max()
|
|
第二种形式会返回一个元组, 元组内元素类型为: (Tensor, LongTensor), 其中, 前者代表对应 dim 上 reduce 后的最大值, 后者代表最大值在维度 dim 中对应的下标.
如果keepdim=True, 则输出的 tensor 的 size 会和输入的相同, 只不过对应 dim 维度上的size为1. 否则, 对应 dim 维度会被 squeeze/reduce, 使得输出的维度比输入的维度少1.
|
|
mm()
注意, 没有torch.mm_版本
|
|
两矩阵相乘, 矩阵的size需要满足乘法规则
其他调用形式:
|
|