Pytorch概述和torch基本运算

Pytorch概述

PyTorch是一个基于Python的库,用来提供一个具有灵活性的深度学习开发平台,其工作流程非常接近Python的科学计算库——numpy。
它主要具有以下3个优点:

  1. 易于使用的API—它就像Python一样简单。
  2. Python的支持—非常类似于numpy。
  3. 动态计算图—取代了具有特定功能的预定义图形,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不变。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值