Pytorch简介
1 | import torch as tc |
1 Tensor张量
tensor很像numpy中的ndarray,就连操作也很相似。
创建Tensor
1 | # Returns a tensor filled with uninitialized data |
tensor([[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 872, 0],
[ 0, 7499635, 0]], dtype=torch.int32)
1 | tc.rand((3, 4)) |
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 | x = tc.randint(0, 5, (2, 3)) |
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 | x = tc.Tensor([2, 3]) |
torch.Size([2]) tensor([2., 3.])
torch.Size([2]) tensor([4., 5.])
1 | z = x + y |
tensor([6., 8.])
tensor([6., 8.])
tensor([6., 8.])
Resize
使用view方法可以将Tensor进行Reshape/Resize: - tensor.view(*shape)
1 | m = tc.randn(2, 2) |
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 | m = tc.randint(0, 10, (2, 3)) |
tensor([[2, 7, 1],
[5, 3, 6]])
tensor([7, 3])
如果Tensor中只有一个元素,可以使用.item()
获取该元素的值。
1 | print(m[1, 2]) |
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 | import numpy as np |
1 | y1 = x1.numpy() |
array([1., 2., 3.], dtype=float32)
1 | y2 = tc.from_numpy(x2) |
tensor([4, 5, 6], dtype=torch.int32)
注意:转换的Tensor和ndarray共享内存!!!
1 | # 更改x1,y1也会变 |
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 | if tc.cuda.is_available(): |
<class 'torch.device'> cuda
迁移方法有两种:
- 直接构造一个在GPU上的Tensor
- 把CPU上的Tensor
1 | if tc.cuda.is_available(): |
tensor([7., 9.], device='cuda:0')
tensor([7., 9.], dtype=torch.float64)