PyTorch基础(一)-----张量(Tensor)

前言

很多人都会拿PyTorch和Google的Tensorflow进行比较,这个肯定是没有问题的,因为他们是最火的两个深度学习框架了。但是说到PyTorch,其实应该先说Torch。

什么是Torch?
Torch是一个与Numpy类似的张量(Tensor)操作库,与Numpy不同的是Torch对GPU支持的很好。Lua是Torch的上层包装,虽然Lua速度很快,Lua实在是太小众了,所以才会有PyTorch的横空出世。

PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。 它主要由Facebook的人工智能研究小组开发。Uber的"Pyro"也是使用的这个库。

PyTorch是一个Python包,提供两个高级功能:

  • 具有强大的GPU加速的张量计算(如NumPy)
  • 包含自动求导系统的的深度神经网络

最后,关于Tensorflow和PyTorch的对比网上已经有很多了,这里就不详细说明了,有兴趣的可以看这篇文章https://zhuanlan.zhihu.com/p/28636490

一、什么是张量(Tensor)

PyTorch是一个处理张量的库,张量是PyTorch里面基础运算单位,一个张量是一个数字、向量、矩阵或者任何n维数组。张量与Numpy的ndarray相同,都表示的是一个多维的矩阵。与ndarray的最大区别就是**:PyTorch的Tensor可以在GPU上运行,而numpy的ndarray只能在CPU上运行,在GPU上运行大大加快了运算速度。**

  • 导包
# 首先要导入相关的包,以保证程序可以正常运行
import numpy as np
import torch
# 我们可以通过打印PyTorch的版本来确定是否导入成功
torch.__version__
  • 新建一个简单的Tensor
# 生成一个2行3列的矩阵
x = torch.rand(2,3)
x
  • 查看Tensor的大小
# 可以使用与numpy相同的shape属性查看
print(x.shape)
# 也可以用使用size()函数
print(x.size())
  • 生成一个多维张量
y = torch.rand(2,3,4,5)
print(y.shape) # 打印y张量的大小
y

在同构的意义下,第0阶张量(r = 0)为标量(Scalar),第一阶张量(r = 1)为向量(Vector),第二阶张量(r = 2)则称为了矩阵(Matrix),第3阶以上的统称为多维张量。

  • 其中,特别主义的是标量,我们先来生成一个标量(scalar):
scalar = torch.tensor(3.1415926)
scalar
# 对于标量, 我们可以直接使用.item()从中取出其对应的Python对象
scalar.item()
# 特别的,如果张量中只有一个元素,也可以用.item()取出对应的Python对象
tensor1 = torch.tensor([3.1415926])
tensor1.item()

二、如何创建一个张量(Tensor)

  • 使用[0,1]均匀分布随机初始化张量
rnd = torch.rand(5,3)
rnd
  • 使用1填充
one = torch.ones(2,2)
one
  • 使用0填充
zero = torch.zeros(2,2)
zero
  • 初始化一个单位矩阵,即对角线为1,其它为0
eye = torch.eye(2,2)
eye

三、常用方法

PyTorch中对张量的操作api和Numpy非常相似,如果熟悉Numpy中的相关操作,它们两个是基本一致的

  • 首先,我们新建一个张量Tensor
rnd = torch.randn(3,3)
rnd

然后我们来进行以下的操作:

  • 沿着行取最大值
max_value,max_idx = torch.max(x,dim = 1)
max_value,max_idx
  • 沿着列取最大值
max_value,max_idx = torch.max(x,dim = 0)
max_value,max_idx
  • 求每行的和
sum_x = torch.sum(x,dim = 1)
sum_x
  • 求每列的和
sum_y = torch.sum(x,dim = 0)
sum_y
  • 求两个张量的和
# 首先我们需要另建一个张量y
y = torch.randn(3,3)
z = x+y
z
  • 任何以“-”结尾的操作都会用结果替换原变量,例如:“x.copy_(y)”,都会改变x
x = torch.randn(3,3)
print('修改前', x)
y = torch.randn(3,3)
x.add_(y)
print('修改后', x)

四、张量(Tensor)和Numpy对象的互相转换

Tensor和numpy对象共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。但这也意味着,如果其中一个改变了,另外一个也会随之改变。

  • Tensor转为Numpy对象
a = torch.randn((3,2))
# 将tensor转为numpy
numpy_a = a.numpy()
print(numpy_a)
  • Numpy对象转为Tensor
torch_a = torch.from_numpy(numpy_a)
print(torch_a)

五、参考文献

https://github.com/zergtant/pytorch-handbook/blob/master/chapter2/2.1.1.pytorch-basics-tensor.ipynb

猜你喜欢

转载自blog.csdn.net/dongjinkun/article/details/113781001