Pytorch概述
PyTorch是一个基于Python的库,用来提供一个具有灵活性的深度学习开发平台,其工作流程非常接近Python的科学计算库——numpy。
它主要具有以下3个优点:
- 易于使用的API—它就像Python一样简单。
- Python的支持—非常类似于numpy。
- 动态计算图—取代了具有特定功能的预定义图形,PyTorch为我们提供了一个框架,以便可以在运行时构建计算图,甚至在运行时更改它们。
PyTorch的其他一些优点还包括:多gpu支持,自定义数据加载器和简化的预处理器等。
PyTorch张量
定义一个张量(tensor):
import torch
x=torch.tensor([5])
输出结果:
tensor([5])
使用 torch.item() 来获得张量中的 value:
x=torch.tensor([5])
print(x.item())
输出结果:
5
张量间的数学运算和我们生活中的基本一样,主要注意除法运算时,结果为向下取整,例如:
x=torch.tensor([5])
y=torch.tensor([3])
z=x/y
输出结果:
tensor([1])
Pytorch构造矩阵
构造一个 3×3 矩阵,不初始化:
x = torch.empty(3, 3)
输出结果:
tensor([[9.2755e-39, 1.0837e-38, 8.4490e-39],
[1.1112e-38, 1.0194e-38, 9.0919e-39],
[8.4490e-39, 9.6429e-39, 8.4490e-39]])
构造一个[0,1]均匀分布随机初始化的二维矩阵:
x = torch.rand(3, 3)
输出结果:
tensor([[0.3728, 0.3594, 0.3439],
[0.4353, 0.9874, 0.4307],
[0.0109, 0.0530, 0.3856]])
#输出x的形状
print(x.size())
#输出x的行数(两种方法)
print(x.size(0))
print(x.size()[0])
#输出x的列数(两种方法)
print(x.size(1))
print(x.size()[1])
输出结果:
torch.Size([3, 3])
3
3
3
3
构造一个矩阵全为 0,数据类型是 long:
x = torch.zeros(3, 3, dtype=torch.long)
输出结果:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
创建一个新的 tensor 基于已经存在的 tensor:
x = torch.zeros(3, 3, dtype=torch.long)
y=x.new_ones(3, 3, dtype=torch.float32)
输出结果:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
两个矩阵相加:
x = torch.zeros(3, 3)
y=torch.ones(3, 3)#全为1的矩阵
z=x+y
#或者下面这种形式
z=torch.add(x, y)
输出结果:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
可以使用标准的 Numpy 类似的索引操作,例如输出新建的矩阵的第2列:
x=torch.rand(3,3)
print(x)
print(x[:,1])
输出结果:
tensor([[0.5004, 0.0889, 0.7766],
[0.0727, 0.6792, 0.9990],
[0.0246, 0.2552, 0.3748]])
tensor([0.0889, 0.6792, 0.2552])
使用 torch.view 改变一个 tensor 的大小或者形状:
x = torch.randn(2,4)
y = x.view(8)
z = x.view(-1, 2) # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())
输出结果:
torch.Size([2, 4]) torch.Size([8]) torch.Size([4, 2])
通过 linspace 构造张量:
x=torch.linspace(0, 3, steps=4)
输出结果:
tensor([0., 1., 2., 3.])
张量转置:
x=torch.tensor([[1,2],[3,4]])
y=x.t()
输出结果:
tensor([[1, 2],
[3, 4]])
tensor([[1, 3],
[2, 4]])
张量拼接:
x=torch.tensor([[1,2],[3,4]])
y=torch.tensor([[5,6],[7,8]])
z=torch.cat([x,y],0)#0代表按行拼接
输出结果:
tensor([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
Tensor与Numpy的相互转换:
y = x.numpy() # Tensor -> Numpy
x = torch.from_numpy(y) # Numpy->Tensor
Tensor和Numpy对象共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。但这也意味着,如果其中一个变了,另外一个也会随之改变。
通过.item()获取tensor中某一个元素
print(x[0][1])
print((x[0][1]).item())
输出结果:
tensor(0.4845)
0.48450732231140137
可以看到直接tensor[idx][idx]得到的还是一个tensor。
Tensor可通过.cuda 方法转为GPU的Tensor,从而享受GPU带来的加速运算。
# 在不支持CUDA的机器下,下一步还是在CPU上运行
device = t.device("cuda:0" if t.cuda.is_available() else "cpu")
x = x.to(device)
y = y.to(x.device)
z = x+y
此外,还可以使用tensor.cuda() 的方式将tensor拷贝到gpu上,但是这种方式不太推荐。
注意:
函数名后面带下划线_ 的函数会修改Tensor本身。例如,x.add_(y)和x.t_()会改变 x,但x.add(y)和x.t()返回一个新的Tensor,而x不变。