什么是 PyTorch?
PyTorch 是 Facebook 人工智能团队开发的一个机器学习和深度学习工具, 用于处理大规模图像分析, 包括物体检测, 分割与分类. 但是它的功能不仅限于此. 它与其它深度学习框架结合, 能够完成复杂的算法. PyTorch 用 Python 和 C++ 编写.
PyTorch 属于深度学习框架中的重要一员, 与 TensorFlow, keras, Theano 等其它深度学习框架不同, 它是动态计算图模式, 其应用模型支持在运行过程中根据运行参数动态改变, 而其它框架都是静态计算图模式, 其模型在运行之前就已经确定. 以下是各个深度学习框架的热度对比:
关于各个深度学习框架的对比, 可以参考网址: Comparison of deep learning software
.
PyTorch 是使用 GPU 和 CPU 优化的深度学习张量库.
下面, 我们将一起来学习 PyTorch 中向量 (Tensor) 的相关操作.
安装与运行
PyTorch 的安装十分简单, 需要用 pip 安装即可:
- pip3 install torch
- pip3 install torchvision
其中 torchvision 包含了一些 torch 内置的图片与视频数据集.
用以下的 Python 代码可以输出安装的 PyTorch 版本信息:
- import torch
- print(torch.version.__version__)
在笔者的电脑上, 输出的结果如下:
1.0.1.post2
向量的基本操作
导入模块
检测是否为 PyTorch 中的向量
is_tensor()函数可以检测某个序列是否为 PyTorch 中的向量, is_storage()可以检测某个序列是否被存储为 PyTorch 中的向量.
可以看到, Python 中的列表并不是 PyTorch 中的向量, 也不会被存储为 PyTorch 中的向量. 那么, 如何创建 PyTorch 中的向量呢?
创建随机向量
利用 randn()函数可以创建随机向量, 随机数为 0~1 的随机浮点数, 可以指定创建的向量的维数.
可以看到, 我们创建了 1*2*3 维的向量, 用 size()函数可以查看向量的维数情况, 用 numel()函数可以查看向量中的所有元素个数.
创建零向量
利用 zeros()函数可以创建零向量, 即所有元素均为零的向量, 只需指定向量的维数即可.
在上面, 我们创建了 4*4 的零向量.
创建单位向量
利用 eye()函数可以创建单位向量, 即主对角元素为 1, 其余元素均为零的向量, 只需指定向量的维数即可. 当二维向量的行数与列数不一样时, 主对角元素为 1, 其余为 0.
从 numpy 中创建向量
PyTorch 支持直接从 numpy 中创建向量, 这为 PyTorch 和 numpy 提供了无缝对接, 这也是 PyTorch 的一个优势.
当然, PyTorch 也可以将向量转化为 numpy 中的 ndarrays.
Tensor 函数创建向量
可以利用 Tensor()直接创建向量.
linspace 与 logspace 创建向量
linspace(tart, end, steps=100, out=None)通过指定开始值, 终值和元素个数创建表示等差数列的一维数组, 可以通过 endpoint 参数指定是否包含终值, 默认值为 True, 即包含终值.
logspace(tart, end, steps=100, out=None)返回一个 1 维张量, 包含在区间 10exp(start)和 10exp(end)上以对数刻度均匀间隔的 steps 个点.
创建均匀分布向量
rand()函数可以创建指定维数的满足均匀分布的向量.
随机整数排列向量
randperm(n, out=None) , 给定参数 n, 返回一个从 0 到 n -1 的随机整数排列.
等差数列向量
arange(start, end, step=1, out=None) , 返回一个 1 维张量, 包含从 start 到 end, 以 step 为步长的一组序列值(默认步长为 1).
寻找最大值, 最小组
argmin()和 argmax()函数可以寻找向量所在的最小值和最大值的下标, 0 表示沿着行查找, 1 表示沿着列查找.
向量拼接
cat()函数在给定维度上对输入的张量序列 seq 进行连接操作, 默认的维度为 0, 即按行拼接.
向量分块
chunk(tensor, chunks, dim=0)函数在给定维度 (轴) 上将输入张量进行分块, 默认为 0, 即按行进行分块.
gather()函数
gather(input, dim, index, out=None), 沿给定轴 dim, 将输入索引张量 index 指定位置的值进行聚合. gather()函数理解起来比较困难, 先看例子, 再解释:
gather 的作用是这样的, index 是索引, 具体是行还是列的索引要看前面 dim , 比如对于我们的例子, [[11, 12], [23, 24]], 指定 dim=1, 也就是横向, 那么索引就是列号. index 的大小就是输出的大小, 所以比如 index 是[[0,0], [1,0]], 那么看 index 第一行, 0 列指的是 11, 同理, 第二行为 1, 0 , 这样就是[24, 23], 参考这样的解释看上面的输出结果, 即可理解 gather 的含义.
索引
index_select(input, dim, index, out=None) , 沿着指定维度对输入进行切片, 取 index 中指定的相应项(index 为一个 LongTensor), 然后返回到一个新的张量, 返回的张量与原始张量_Tensor_有相同的维度(在指定轴上).
split()函数
split(tensor, split_size, dim=0), 将输入张量分割成相等形状的 chunks(如果可分). 如果沿指定维的张量形状大小不能被 split_size 整分, 则最后一个分块会小于其它分块.
向量转置
二维向量的转置可以用 t()或 transpos(1, 0)实现.
unbind()
unbind(tensor, dim=0), 移除指定维后, 返回一个元组, 包含了沿着指定维切片后的各个切片, 默认维度为 1, 表示行, 1 表示列.
判断是否为零元素
nonzero()函数可以判断向量中的元素是否为 0.
向量运算
以下将演示几种常见的矩阵运算.
矩阵的点乘与矩阵乘法
总结
本文的 GitHub 地址为: .
注意: 不妨了解下笔者的微信公众号: Python 爬虫与算法(微信号为: easy_web_scrape), 欢迎大家关注~
来源: https://www.cnblogs.com/jclian91/p/10450483.html