# 什么是PyTorch？

PyTorch是一个基于python的科学计算包，主要针对两类人群：

• 作为NumPy的替代品，可以利用GPU的性能进行计算
• 作为一个高灵活性、速度快的深度学习平台

## 入门

### 张量

Tensor（张量）类似于NumPyndarray，但还可以在GPU上使用来加速计算。

from __future__ import print_function
import torch


x = torch.empty(5, 3)
print(x)


tensor([[2.2391e-19, 4.5869e-41, 1.4191e-17],
[4.5869e-41, 0.0000e+00, 0.0000e+00],
[0.0000e+00, 0.0000e+00, 0.0000e+00],
[0.0000e+00, 0.0000e+00, 0.0000e+00],
[0.0000e+00, 0.0000e+00, 0.0000e+00]])


x = torch.rand(5, 3)
print(x)


tensor([[0.5307, 0.9752, 0.5376],
[0.2789, 0.7219, 0.1254],
[0.6700, 0.6100, 0.3484],
[0.0922, 0.0779, 0.2446],
[0.2967, 0.9481, 0.1311]])


x = torch.zeros(5, 3, dtype=torch.long)
print(x)


tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])


x = torch.tensor([5.5, 3])
print(x)


tensor([5.5000, 3.0000])


x = x.new_ones(5, 3, dtype=torch.double)      # new_* methods take in sizes
print(x)

x = torch.randn_like(x, dtype=torch.float)    # 重载 dtype!
print(x)                                      # 结果有相同的size


tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[ 1.6040, -0.6769,  0.0555],
[ 0.6273,  0.7683, -0.2838],
[-0.7159, -0.5566, -0.2020],
[ 0.6266,  0.3566,  1.4497],
[-0.8092, -0.6741,  0.0406]])


print(x.size())


torch.Size([5, 3])


torch.Size本质上还是tuple，所以支持tuple的一切操作。

### 运算

y = torch.rand(5, 3)
print(x + y)


tensor([[ 2.5541,  0.0943,  0.9835],
[ 1.4911,  1.3117,  0.5220],
[-0.0078, -0.1161,  0.6687],
[ 0.8176,  1.1179,  1.9194],
[-0.3251, -0.2236,  0.7653]])


print(torch.add(x, y))


tensor([[ 2.5541,  0.0943,  0.9835],
[ 1.4911,  1.3117,  0.5220],
[-0.0078, -0.1161,  0.6687],
[ 0.8176,  1.1179,  1.9194],
[-0.3251, -0.2236,  0.7653]])


result = torch.empty(5, 3)
print(result)


tensor([[ 2.5541,  0.0943,  0.9835],
[ 1.4911,  1.3117,  0.5220],
[-0.0078, -0.1161,  0.6687],
[ 0.8176,  1.1179,  1.9194],
[-0.3251, -0.2236,  0.7653]])


# adds x to y
print(y)


tensor([[ 2.5541,  0.0943,  0.9835],
[ 1.4911,  1.3117,  0.5220],
[-0.0078, -0.1161,  0.6687],
[ 0.8176,  1.1179,  1.9194],
[-0.3251, -0.2236,  0.7653]])


print(x[:, 1])


tensor([-0.6769,  0.7683, -0.5566,  0.3566, -0.6741])


x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())


torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])


x = torch.randn(1)
print(x)
print(x.item())


tensor([0.0445])
0.0445479191839695


## NumPy桥

Torch张量和NumPy数组将共享它们的底层内存位置，更改一个将更改另一个。

### 将torch的Tensor转化为NumPy数组

a = torch.ones(5)
print(a)


tensor([1., 1., 1., 1., 1.])


b = a.numpy()
print(b)


[1. 1. 1. 1. 1.]


a.add_(1)
print(a)
print(b)


tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]


### 将NumPy数组转化为Torch张量

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a)
print(b)


[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)


CPU上的所有张量(CharTensor除外)都支持转换为NumPy以及由NumPy转换回来。

## CUDA上的张量

# let us run this cell only if CUDA is available
# 我们将使用torch.device来将tensor移入和移出GPU
if torch.cuda.is_available():
device = torch.device("cuda")          # a CUDA device object
y = torch.ones_like(x, device=device)  # 直接在GPU上创建tensor
x = x.to(device)                       # 或者使用.to("cuda")方法
z = x + y
print(z)
print(z.to("cpu", torch.double))       # .to也能在移动时改变dtype


tensor([1.0445], device='cuda:0')
tensor([1.0445], dtype=torch.float64)


• #### Python学习知识库

coco369 python 85页 2019年5月26日
190

2716

• #### aiohttp 中文文档

HuberTRoy python 124页 2018年7月8日
34

• #### 深入理解 Neutron -- OpenStack 网络实现

yeasy openstack 47页 2018年6月24日
136

• #### 命令行的艺术

jlevy linux 34页 2019年5月26日
46710

• #### Python方向综合面试题

jackfrued python 115页 2019年5月26日
35