Pytorch 简介
Pytorch 是一个基于 Numpy 的科学计算包, 向它的使用者提供了两大功能:
- 作为 Numpy 的替代者,向用户提供使用 GPU 强大功能的能力
- 做为一款深度学习的平台,向用户提供最大的灵活性和速度
Pytorch 的安装
在 Pytorch 的官网 可以找到在各种系统中的每个版本安装 Pytorch 的安装方法,直接把命令复制粘贴即可。
Pytorch 的导入
Tensors 张量:张量的概念类似于 Numpy 中的 ndarray 数据结构,最大的区别在于 Tensor 可以使用 GPU 的加速功能。
要使用 Pytorch,首先当然是导入 torch:
1 | import torch |
创建矩阵
创建一个没有初始化的矩阵:
1 | x = torch.empty(5, 3) |
输出结果:
1 | tensor([[1.1969e+14, 7.0906e-43, 1.1968e+14], |
创建一个有初始化的矩阵:
1 | x = torch.rand(5, 3) |
输出结果:
1 | tensor([[0.3609, 0.0462, 0.3337], |
对比有无初始化的矩阵,当声明一个未初始化的矩阵时,它本身不包含任何确切的值。当创建一个未初始化的矩阵时,分配给矩阵的内存中有什么数值就赋值给了这个矩阵,本质上是毫无意义的数据。
创建一个全零矩阵并可指定数据元素的类型为 long:
1 | x = torch.zeros(5, 3, dtype=torch.long) |
输出结果:
1 | tensor([[0, 0, 0], |
直接通过数据创建张量:
1 | x = torch.tensor([2.5, 3.5]) |
输出结果:
1 | tensor([2.5000, 3.5000]) |
通过已有的一个张量创建相同尺寸的新张量:
1 | # 利用 news_methods 方法得到一个张量 |
输出结果:
1 | tensor([[1., 1., 1.], |
可用如下命令查询张量的尺寸:
1 | print(x.size()) |
输出结果:
1 | torch.Size([5, 3]) |
torch.Size
函数本质上返回的是一个 tuple,因此它支持一切元组的操作:
1 | rows, cols = x.size() |
输出结果:
1 | 5 3 |
Pytorch 的基本运算操作
加法操作:
1 | y = torch.rand(5, 3) |
输出结果:
1 | tensor([[1.7137, 1.1927, 1.5771], |
第二种加法方式:
1 | print(torch.add(x, y)) |
输出结果:
1 | tensor([[1.7137, 1.1927, 1.5771], |
第三种加法方式:
1 | # 提前设定一个空的张量 |
输出结果:
1 | tensor([[1.7137, 1.1927, 1.5771], |
第四种加法方式:in-place(原地置换)
1 | y.add_(x) |
输出结果:
1 | tensor([[1.7137, 1.1927, 1.5771], |
注意:
- 所有可以 in-place 操作函数都有一个下划线的后缀的方法,调用此方法会直接在原张量中修改
- 比如 x.copy_(y), x.add_(y),都会直接改变 x 的值
用类似于 Numpy 的方式对张量进行操作:
1 | print(x[:, 1]) |
输出结果:
1 | tensor([1., 1., 1., 1., 1.]) |
改变张量的形状:torch.view()
1 | x = torch.randn(4, 4) |
输出结果:
1 | torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8]) |
如果张量中只有一个元素,可以用 .item()
将值取出,作为一个普通的 python 数字:
1 | x = torch.randn(1) |
输出结果:
1 | tensor([-2.2173]) |
Torch Tensor 和 Numpy array 之间的相互转换
Torch Tensor 和 Numpy array 共享底层的内存空间,也就是说改变其中一个的值,另一个也会随之被改变。
创建一个 tensor:
1 | a = torch.ones(5) |
输出结果:
1 | tensor([1., 1., 1., 1., 1.]) |
将 Torch Tensor 转换为 Numpy array:
1 | b = a.numpy() |
输出结果:
1 | [1. 1. 1. 1. 1.] |
对其中一个进行加法操作,另一个也随之被改变:
1 | a.add_(1) |
输出结果:
1 | tensor([2., 2., 2., 2., 2.]) |
将 Numpy array 转换为 Torch Tensor:
1 | import numpy as np |
输出结果:
1 | [1. 1. 1. 1. 1.] |
所有在 CPU 上的 Tensors,除了 CharTensor,都可以转换为 Numpy array 并可以反向转换.
Cuda Tensor 在 GUP 上的 Tensor
Pytorch 的一大优势是其可以在 GPU 上运行。多核心的 GPU 会很高效地运算机器学习相关数据。
Tensors 可以用 .to()
方法来将其移动到任意设备上:
1 | # 如果服务器上已经安装了 GPU 和 CUDA |
输出结果:
1 | tensor([1.5561], device='cuda:0') |