[入门]1. Pytorch简介

Pytorch简介

1
import torch as tc

1 Tensor张量

tensor很像numpy中的ndarray,就连操作也很相似。

创建Tensor

1
2
# Returns a tensor filled with uninitialized data
tc.empty((5, 3), dtype=tc.int32)
tensor([[      0,       0,       0],
        [      0,       0,       0],
        [      0,       0,       0],
        [      0,     872,       0],
        [      0, 7499635,       0]], dtype=torch.int32)
1
2
3
4
5
tc.rand((3, 4))
# tc.zeros
# tc.ones
# tc.randn
# tc.randn_like
tensor([[0.7244, 0.4736, 0.6582, 0.1932],
        [0.5942, 0.5942, 0.5028, 0.3844],
        [0.1217, 0.7820, 0.6298, 0.0850]])
1
2
3
x = tc.randint(0, 5, (2, 3))
print(x)
print(x.shape)
tensor([[0, 2, 1],
        [2, 0, 0]])
torch.Size([2, 3])

torch.Size 实际上就是一个 tuple, 支持一切 tuple 的操作。

算术运算

Tensor支持像ndarray一样的加减乘除操作,还可以用形如add一样的函数来操作: 1. z = x + y 2. z = x.add(y) 3. x.add(y, out=z)
等价于z = x + y 4. x.add_(y)
等同于 x = x + y凡是有_的都表示调用的对象自身会被改变

1
2
3
4
x = tc.Tensor([2, 3])
y = tc.Tensor([4, 5])
print(x.shape, x)
print(y.shape, y)
torch.Size([2]) tensor([2., 3.])
torch.Size([2]) tensor([4., 5.])
1
2
3
4
5
6
7
z = x + y
print(z)
z = 0
z = x.add(y)
print(z)
x.add_(y)
print(x)
tensor([6., 8.])
tensor([6., 8.])
tensor([6., 8.])

Resize

使用view方法可以将Tensor进行Reshape/Resize: - tensor.view(*shape)

1
2
m = tc.randn(2, 2)
print(m)
tensor([[ 0.8630, -0.8310],
        [-1.5522,  0.3069]])
1
m.view(4, 1)
tensor([[ 0.8630],
        [-0.8310],
        [-1.5522],
        [ 0.3069]])
1
m.view(4)
tensor([ 0.8630, -0.8310, -1.5522,  0.3069])
1
m.view(-1, 4)
tensor([[ 0.8630, -0.8310, -1.5522,  0.3069]])

索引

Tensor可以像ndarray一样索引。

1
2
3
m = tc.randint(0, 10, (2, 3))
print(m)
print(m[:, 1])
tensor([[2, 7, 1],
        [5, 3, 6]])
tensor([7, 3])

如果Tensor中只有一个元素,可以使用.item()获取该元素的值。

1
2
print(m[1, 2])
print(m[1, 2].item())
tensor(6)
6

更多说明见官方文档的Tensor部分

2 Tensor和ndarray

All the Tensors on the CPU except a CharTensor support converting to NumPy and back.

  • Tensor转ndarray: tensor.numpy()
  • ndarray转Tensor: torch.from_numpy()
1
2
3
import numpy as np
x1 = tc.Tensor([1, 2, 3])
x2 = np.array([4, 5, 6])
1
2
y1 = x1.numpy()
y1
array([1., 2., 3.], dtype=float32)
1
2
y2 = tc.from_numpy(x2)
y2
tensor([4, 5, 6], dtype=torch.int32)

注意:转换的Tensor和ndarray共享内存!!!

1
2
3
4
5
6
# 更改x1,y1也会变
x1[0] = 0
print(x1, y1)
# 更改x2, y2也会变
x2[0] = 0
print(x2, y2)
tensor([0., 2., 3.]) [0. 2. 3.]
[0 5 6] tensor([0, 5, 6], dtype=torch.int32)

3 迁移到GPU上

在深度学习中使用GPU来对模型进行训练是可以通过并行化其计算来提高运行效率。这需要我们将内存中的数据复制到GPU的显存中去,从而可以通过GPU来进行运算。 torch.cuda.is_available()方法可以判断GPU是否可用:

1
tc.cuda.is_available()
True

如果可用,我们就可以将Tensor复制到GPU上,迁移时一般需要接受一个device参数,用于指定哪一个设备上。

1
2
3
if tc.cuda.is_available():
device = tc.device("cuda")
print(type(device), device)
<class 'torch.device'> cuda

迁移方法有两种:

  • 直接构造一个在GPU上的Tensor
  • 把CPU上的Tensor
1
2
3
4
5
6
7
8
9
10
11
if tc.cuda.is_available():
device = tc.device("cuda")
# 直接
y = tc.ones_like(x, device=device)
# 间接
x = x.to(device)
# z也是cuda上的
z = x + y
print(z)
# 转会到CPU上
print(z.to("cpu", tc.double))
tensor([7., 9.], device='cuda:0')
tensor([7., 9.], dtype=torch.float64)