PyTorch学习笔记(二):Tensor操作

您所在的位置:网站首页 array和tensor PyTorch学习笔记(二):Tensor操作

PyTorch学习笔记(二):Tensor操作

2023-02-15 22:05| 来源: 网络整理| 查看: 265

什么是Tensor

Tensor,又名张量,最早接触这个词是来自于TensorFlow,这个概念也被广泛的应用于不同的深度学习框架。

如果一个物理量,在物体的某个位置上只是一个单值,那么就是普通的标量,比如密度。如果它在同一个位置、从不同的方向上看,有不同的值,而且这个数恰好可以用矩阵乘观察方向来算出来,就是张量。几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。

从工程角度来讲,可简单地认为它就是一个数组,且支持高效的科学计算。它可以是一个数(标量)、一维数组(向量)、二维数组(矩阵)和更高维的数组(高阶数据)。

PyTorch中的Tensor

Tensor是PyTorch中重要的数据结构,可认为是一个高维数组。Tensor和Numpy中的ndarrays类似,但Tensor可以使用GPU进行加速计算。PyTorch中有许多不同的方法可以创建Tensor。

创建Tensor的方法:

torch.Tensor(*sizes):随机创建指定形状的Tensor。 使用该方法创建Tensor时,系统不会马上分配空间,只是会计算剩余的内存是否足够使用,使用到Tensor时才会分配。而其它操作都是在创建完Tensor之后马上进行空间分配。

>>> a = torch.Tensor(2, 3) >>> a tensor([[1.2748e-10, 4.5916e-41, 0.0000e+00], [0.0000e+00, 0.0000e+00, 0.0000e+00]])

torch.Tensor(data):将List转换为Tensor。

>>> a = torch.Tensor([[1,2,3],[4,5,6]]) >>> a tensor([[1., 2., 3.], [4., 5., 6.]])

torch.ones(data):创建全1的Tensor。

>>> torch.ones(2, 3) tensor([[1., 1., 1.], [1., 1., 1.]])

torch.zeros(data):创建全0的Tensor。

>>> torch.zeros(2, 3) tensor([[0., 0., 0.], [0., 0., 0.]])

torch.eye(*size):创建对角Tensor。

>>> torch.eye(3, 3) tensor([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])

torch.arange(s, e, step):生成从s到e,步长为step的一维Tensor。

>>> torch.arange(1, 10, 2) tensor([1, 3, 5, 7, 9])

torch.linspace(s, e, n):生成从s到e,size为n的一维Tensor。

>>> torch.linspace(1, 10, 2) tensor([ 1., 10.])

torch.randn(*size):标准分布。

>>> torch.randn(2, 3) tensor([[-0.8712, -0.2707, -0.4527], [ 0.3612, 0.2612, -0.6841]])

torch.rand(*size):均匀分布。

>>> torch.rand(2, 3) tensor([[0.5604, 0.5680, 0.5437], [0.6341, 0.0839, 0.2817]])

torch.tensor是在0.4版本新增加的一个新版本的创建tensor方法,使用的方法,和参数几乎和np.array完全一致。不论输入的类型是什么,torch.tensor都会进行数据拷贝,不会共享内存。

>>> a = np.array([1, 2, 3]) >>> b = torch.tensor(a) >>> a[0] = 0 >>> a array([0, 2, 3]) >>> b tensor([1, 2, 3], dtype=torch.int32) Tensor转换:

Torch定义了七种CPU tensor类型和八种GPU tensor类型:

dtype

他们之间可以通过内置函数互相转换:

将tensor投射为long类型:newtensor = tensor.long()

将tensor投射为半精度浮点(16位浮点)类型:newtensor = tensor.half()

将tensor投射为int类型:newtensor = tensor.int()

将tensor投射为double类型:newtensor = tensor.double()

将tensor投射为float类型:newtensor = tensor.float()

将tensor投射为char类型:newtensor = tensor.char()

将tensor投射为byte类型:newtensor = tensor.byte()

将tensor投射为short类型:newtensor = tensor.short()

>>> a.dtype torch.float32 >>> a.int() tensor([1, 2, 3], dtype=torch.int32) >>> a.double() tensor([1., 2., 3.], dtype=torch.float64) >>> a.long() tensor([1, 2, 3])

Tensor可以存放在不同的device(cpu/gpu)。

cpu –> gpu,使用data.cuda()。 gpu –> cpu,使用data.cpu()。

>>> a = torch.Tensor([1, 2, 3], device=torch.device('cpu')) >>> a.device device(type='cpu')

Tensor可以和Numpy的ndarray互相转换。返回的新tensor与源tensor共享内存,也即更改其中的一个,另外一个也会跟着改变。 当numpy的数据类型和Tensor的类型不一样的时候,数据会被复制,不会共享内存。

Tensor –> Numpy.ndarray ,可以使用 data.numpy()。 Numpy.ndarray –> Tensor ,可以使用torch.from_numpy(data)。

>>> a.numpy() array([1., 2., 3.], dtype=float32)

Tensor –>Python List,可以使用 data.tolist()。

>>> a.tolist() [1., 2., 3.]

一个tensor如果想要转换为标准的python对象数值,需要调用tensor.item(),这个方法只对包含一个元素的tensor适用。

>>> a tensor(10) >>> a.item() 10 >>> c = torch.tensor([1, 2, 3]) >>> c.item() Traceback (most recent call last): File "", line 1, in ValueError: only one element tensors can be converted to Python scalars Tensor常规操作

查看Tensor的大小:tensor.size()。 查看Tensor的大小:tensor.shape。

>>> a.size() torch.Size([3]) >>> a.shape torch.Size([3])

统计Tensor的元素个数:Tensor.numel()。

>>> a.numel() 3

调整tensor的形状:tensor.view()。 该函数必须保证调整前后元素总数一致。view不会修改自身的数据,返回的新tensor与源tensor共享内存,也即更改其中的一个,另外一个也会跟着改变。

>>> a.view(-1, 3) tensor([[1., 2., 3.]])

为Tensor添加维度:tensor.unsqueeze()。 为Tensor减少维度:tensor.squeeze()。

>>> a tensor([1., 2., 3.]) >>> b = a.unsqueeze(0) >>> b tensor([[1., 2., 3.]]) >>> b = b.squeeze(0) >>> b tensor([1., 2., 3.]) Tensor索引操作

Tensor支持与numpy.ndarray类似的索引操作,语法上也类似,索引出来的结果与原tensor共享内存,也即修改一个,另一个会跟着修改。

索引示例如下:

>>> a = torch.rand(3, 3) >>> a tensor([[0.8817, 0.0785, 0.8402], [0.9164, 0.9220, 0.8753], [0.1414, 0.7123, 0.9890]]) >>> a[1] tensor([0.9164, 0.9220, 0.8753]) >>> a[:, 0] tensor([0.8817, 0.9164, 0.1414]) >>> a[a > 0.5] tensor([0.8817, 0.8402, 0.9164, 0.9220, 0.8753, 0.7123, 0.9890]) Tensor运算

PyTorch支持几种不同的运算,如下示例所示:

Tensor内置函数:Tensor.sum()。 Torch运算函数:Torch.sum()。

>>> a.sum() tensor(6.) >>> torch.sum(a) tensor(6.) >>> a.sum_()

不修改Tensor的内置函数:Tensor.add(b)。 修改Tensor的内置函数:Tensor.add_(b)。 函数名以_结尾的都是inplace方式,即会修改调用者自己的数据。

>>> a = torch.tensor(6) >>> b = torch.tensor(4) >>> a.add(b) tensor(10) >>> a tensor(6) >>> a.add_(b) tensor(10) >>> a tensor(10)

符号运算:tensor + tensor。

>>> a + b tensor(14)

常用的Tensor操作如上所示,但是以上介绍并不包括所有的Tensor操作,详细的可以查看PyTorch手册。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3