pytorch之张量的相关介绍

Posted WXiujie123456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch之张量的相关介绍相关的知识,希望对你有一定的参考价值。

目录

张量是什么:各种数值数据

张量的创建

使用Python中的列表或者序列

使用numpy中的数组创建tensor

使用torch的API创建tensor

torch.Tensor和torch.tensor的区别

torch.Tensor

torch.tensor()

Pytorch中tensor的常用方法

获取tensor中的数据(当tensor中只有一个元素可用):tensor.item()

转化为numpy数组:t1.numpy()

获取形状:tensor.size()

形状改变:tensor.view((3,4))

获取维数:tensor.dim()

获取最值:tensor.max() tensor.min()

转置:tensor.t() tensor.transpose(dim1,dim2) tensor.permute(维度参数列表)

tensor的切片和索引

tensor的数据类型

获取tensor的数据类型 tensor.dtype

创建数据的时候指定类型

将tensor类型的数据转换成特定类型

tensor的其他操作

tensor和tensor相加

CUDA中的tensor


张量是什么:各种数值数据

  • 0阶张量:常数,eg:1

  • 1阶张量:向量,eg:[1,2,3]

  • 2阶张量:矩阵,eg:[[1.2]]

  • n阶张量

阶指的是一个高维数组的形状

张量的创建

首先需要先安装好Torch包,导入torch

import torch

使用Python中的列表或者序列

import torch
import numpy as np
print(torch.tensor([[1.,-1.],[1.,-1.]]))

运行结果:

tensor([[ 1., -1.],

[ 1., -1.]])

使用numpy中的数组创建tensor

array1=np.arange(12).reshape(3,4)
print(array1)
print(torch.tensor(array1))
print(torch.tensor(np.array([[1,2,3],[4,5,6]])))

运行结果:

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

tensor([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]], dtype=torch.int32)

tensor([[1, 2, 3],

[4, 5, 6]], dtype=torch.int32)

使用torch的API创建tensor

(根据观察和实践,括号里加不加[]输出结果都一样,含义都是形状参数)

  • torch.empty(3,4) #创建3行4列的空的tensor,会用无用数据进行填充

  • torch.ones([3,4]) #创建3行4列的全为1的tensor

  • torch.zeros([3,4]) #创建3行4列的全为0的tensor

  • torch.rand([3,4]) #创建3行4列的随机值的tensor,随机值的区间是[0,1)

  • torch.randint(low=0,high=10,size=[3,4]) #创建3行4列的随机值的tensor,随机值的区间是[low,high)

  • torch.randint(0,10,(3,4))

  • torch.randn(3,4)#创建3行4列的随机值的tensor,随机值的分布式均为0,方差为1

以上代码的输出结果为:

tensor([[1.0194e-38, 1.0469e-38, 1.0010e-38, 8.9081e-39],

[8.9082e-39, 5.9694e-39, 8.9082e-39, 1.0194e-38],

[9.1837e-39, 4.6837e-39, 9.9184e-39, 9.0000e-39]])

tensor([[1., 1., 1., 1.],

[1., 1., 1., 1.],

[1., 1., 1., 1.]])

tensor([[0., 0., 0., 0.],

[0., 0., 0., 0.],

[0., 0., 0., 0.]])

tensor([[0.3854, 0.2613, 0.5499, 0.7777],

[0.0138, 0.0527, 0.2157, 0.7534],

[0.9140, 0.2811, 0.4065, 0.6411]])

tensor([[6, 8, 7, 5],

[7, 1, 2, 1],

[3, 4, 5, 4]])

tensor([[8, 4, 6, 2],

[0, 0, 9, 0],

[0, 1, 9, 2]])

tensor([[-1.8722, -0.5870, 0.4326, -1.3008],

[ 0.2789, -0.4924, 0.8317, -1.5052],

[ 1.1085, -2.1004, 0.4730, 1.7097]])

torch.Tensor和torch.tensor的区别

在Pytorch中,Tensor和tensor都用于生成新的张量。但还是有区别的!

torch.Tensor

torch.Tensor() Python类,更明确的说,是默认张量类型torch.FloatTensor()的别名,torch.Tensor([1,2]) 会调用Tensor类的构造函数init(),生成单精度浮点类型的张量

a=torch.Tensor([1,2])
print(a)
print(a.type())

运行结果:

tensor([1., 2.])

torch.FloatTensor

torch.tensor()

torch.tensor()仅仅是Python的函数,函数原型是:

torch.tensor(data, dtype=None, device=None, requires_grad=False)

其中data可以是:list, tuple, array, scalar等类型。 torch.tensor()可以从data中的数据部分做拷贝(而不是直接引用),根据原始数据类型生成相应的torch.LongTensor,torch.FloatTensor,torch.DoubleTensor。

如下例:

a=torch.tensor([1,2])
print(a.type())
b=torch.tensor([1.,2.])
print(b.type())
c=torch.tensor([1,2],dtype=torch.float64)
print(c.type())

运行结果:

torch.LongTensor

torch.FloatTensor

torch.DoubleTensor

Pytorch中tensor的常用方法

获取tensor中的数据(当tensor中只有一个元素可用):tensor.item()

a=torch.tensor(np.arange(1))
print(a)
print(a.item())

运行结果

tensor([0], dtype=torch.int32)

0

转化为numpy数组:t1.numpy()

t1=torch.tensor([[[1]]])
print(t1)
print(t1.numpy())

运行结果:

tensor([[[1]]])

[[[1]]]

获取形状:tensor.size()

t2=torch.tensor([[1,2,3],[5,5,8]])
print(t2.size())
print(t2.size(-1))#获取最后一个维度的形状

运行结果:

torch.Size([2, 3])

3

形状改变:tensor.view((3,4))

类似于numpy的reshape,是一种浅拷贝,仅仅是形状发生改变

说明:view()中若有参数-1,说明这个数组根据形状自动补齐

如:

t3=torch.tensor([[1,2],[3,4],[5,6]])
print(t3)
print(t3.view((2,3)))#不会改变t3本身的形状
print(t3)
print(t3.view(-1))#一维
print(t3.view(6,-1))#6行1列
print(t3.view(2,-1))#2行3列

运行结果:

tensor([[1, 2],

[3, 4],

[5, 6]])

tensor([[1, 2, 3],

[4, 5, 6]])

tensor([[1, 2],

[3, 4],

[5, 6]])

tensor([1, 2, 3, 4, 5, 6])

tensor([[1],

[2],

[3],

[4],

[5],

[6]])

tensor([[1, 2, 3],

[4, 5, 6]])

获取维数:tensor.dim()

t3=torch.tensor([[1,2],[3,4],[5,6]])
print(t3.dim())

运行结果:

2

获取最值:tensor.max() tensor.min()

t3=torch.tensor([[1,2],[3,4],[5,6]])
print(t3.min())
print(t3.max())

运行结果:

tensor(1)

tensor(6)

可见执行结果只会返回tensor类型的一个数

转置:tensor.t() tensor.transpose(dim1,dim2) tensor.permute(维度参数列表)

t4=torch.tensor(np.arange(24).reshape(2,3,4))*#**生成一个三维数组,形状见输出
print(t4)
print(t4.transpose(0,1))#n维数组需要2个参数,作用是交换两个维度,这里使t4数组的第一维和第二维转置
print(t4.permute(0,2,1))#n维数组,需要n个参数,把需要交换的维度标清楚
print(t4) #这里可见转置操作不会改变张量本身的形状
t5=torch.tensor(np.arange(15).reshape(3,5))
print(t5)
print(t5.t())#只支持2维
print(t5.transpose(0,1))#2维的话参数不可以省略
print(t5.permute(1,0))#2维的话参数 不可以省略

运行结果:

tensor([[[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]],

[[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]]], dtype=torch.int32)

tensor([[[ 0, 1, 2, 3],

[12, 13, 14, 15]],

[[ 4, 5, 6, 7],

[16, 17, 18, 19]],

[[ 8, 9, 10, 11],

[20, 21, 22, 23]]], dtype=torch.int32)

tensor([[[ 0, 4, 8],

[ 1, 5, 9],

[ 2, 6, 10],

[ 3, 7, 11]],

[[12, 16, 20],

[13, 17, 21],

[14, 18, 22],

[15, 19, 23]]], dtype=torch.int32)

tensor([[[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]],

[[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]]], dtype=torch.int32)

tensor([[ 0, 1, 2, 3, 4],

[ 5, 6, 7, 8, 9],

[10, 11, 12, 13, 14]], dtype=torch.int32)

tensor([[ 0, 5, 10],

[ 1, 6, 11],

[ 2, 7, 12],

[ 3, 8, 13],

[ 4, 9, 14]], dtype=torch.int32)

tensor([[ 0, 5, 10],

[ 1, 6, 11],

[ 2, 7, 12],

[ 3, 8, 13],

[ 4, 9, 14]], dtype=torch.int32)

tensor([[ 0, 5, 10],

[ 1, 6, 11],

[ 2, 7, 12],

[ 3, 8, 13],

[ 4, 9, 14]], dtype=torch.int32)

tensor的切片和索引

和numpy中大致相同

t4=torch.tensor(np.arange(24).reshape(2,3,4))#生成一个三维数组,形状见输出
print(t4)
print(t4[0,0,0])#获取数字0
print(t4[1,2,3])#获取数字23
print(t4[0])#与下面等价,切片
print(t4[0,:,:])
print(t4[:,:,1])

运行结果:

tensor([[[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]],

[[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]]], dtype=torch.int32)

tensor(0, dtype=torch.int32)

tensor(23, dtype=torch.int32)

tensor([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]], dtype=torch.int32)

tensor([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]], dtype=torch.int32)

tensor([[ 1, 5, 9],

[13, 17, 21]], dtype=torch.int32)

tensor的数据类型

获取tensor的数据类型 tensor.dtype

t4=torch.tensor(np.arange(24).reshape(2,3,4))#生成一个三维数组,形状见输出
print(t4.dtype)

运行结果:

torch.int32

创建数据的时候指定类型

print(torch.ones((2,3),dtype=torch.float32))#默认情况都是float32
print(torch.ones((2,3),dtype=torch.int32))
print(torch.ones((2,3),dtype=torch.float64))
print(torch.tensor(([1,2],[3,4]),dtype=torch.float64))

运行结果:

tensor([[1., 1., 1.],

[1., 1., 1.]])

tensor([[1, 1, 1],

[1, 1, 1]], dtype=torch.int32)

tensor([[1., 1., 1.],

[1., 1., 1.]], dtype=torch.float64)

tensor([[1., 2.],

[3., 4.]], dtype=torch.float64)

将tensor类型的数据转换成特定类型

t5=torch.tensor([[2.3,5.6],[3.5,6.9]])
print(t5)
print(t5.half())
print(t5.float())
print(t5.double())
print(t5.short())
print(t5.int())
print(t5.long())
print(t5)#上述操作均不会改变t5本身

运行结果:

tensor([[2.3000, 5.6000],

[3.5000, 6.9000]])

tensor([[2.3008, 5.6016],

[3.5000, 6.8984]], dtype=torch.float16)

tensor([[2.3000, 5.6000],

[3.5000, 6.9000]])

tensor([[2.3000, 5.6000],

[3.5000, 6.9000]], dtype=torch.float64)

tensor([[2, 5],

[3, 6]], dtype=torch.int16)

tensor([[2, 5],

[3, 6]], dtype=torch.int32)

tensor([[2, 5],

[3, 6]])

tensor([[2.3000, 5.6000],

[3.5000, 6.9000]])

tensor的其他操作

方法加下划线(如add_())会就地修改数据本身

tensor和tensor相加

x=torch.ones(3,5)
y=torch.rand(3,5)
print(x+y)
print(torch.add(x,y))
print(x.add(y))
print(x)#以上操作不会改变x本身
print(x.add_(y))
print(x)#add_会改变x本身

运行结果:

tensor([[1.0626, 1.2198, 1.2891, 1.7517, 1.4450],

[1.0384, 1.2170, 1.3615, 1.4150, 1.0491],

[1.5048, 1.5946, 1.4347, 1.3700, 1.8832]])

tensor([[1.0626, 1.2198, 1.2891, 1.7517, 1.4450],

[1.0384, 1.2170, 1.3615, 1.4150, 1.0491],

[1.5048, 1.5946, 1.4347, 1.3700, 1.8832]])

tensor([[1.0626, 1.2198, 1.2891, 1.7517, 1.4450],

[1.0384, 1.2170, 1.3615, 1.4150, 1.0491],

[1.5048, 1.5946, 1.4347, 1.3700, 1.8832]])

tensor([[1., 1., 1., 1., 1.],

[1., 1., 1., 1., 1.],

[1., 1., 1., 1., 1.]])

tensor([[1.0626, 1.2198, 1.2891, 1.7517, 1.4450],

[1.0384, 1.2170, 1.3615, 1.4150, 1.0491],

[1.5048, 1.5946, 1.4347, 1.3700, 1.8832]])

tensor([[1.0626, 1.2198, 1.2891, 1.7517, 1.4450],

[1.0384, 1.2170, 1.3615, 1.4150, 1.0491],

[1.5048, 1.5946, 1.4347, 1.3700, 1.8832]])

CUDA中的tensor

CUDA( Compute Unified Device Architecture),是NVIDIA推出的运算平台,CUDATM是种由NVIDIA推出的通用并行计算架构,该架构使GP能够解决复杂的计问题。

torch.cuda这个模块增加了对 CUDA tensor的支持,能够在cpu和gpu上使用相同的方法操作tensor。

通过.to方法能够把一个tensor转移到另外一个设备(比如从CPU转到GPU)

print(torch.cuda.is_available()) #表示我的电脑上不支持GPU执行torch代码
device=torch.device('cuda' if torch.cuda.is_available()else 'cpu')
print(device)#输出cuda
print(torch.zeros([2,3],device=device))#唉,俺的电脑GPU不支持,该换啦
a=torch.zeros(1,3)
print(a.to(device))

运行结果:

False

cpu

tensor([[0., 0., 0.],

[0., 0., 0.]])

tensor([[0., 0., 0.]])

归纳GPU中tensor的使用:

实例化device:torch.devive(‘cuda:0’ if torch.cuda.is_available() else 'cpu')

tensor.to(device) #把tensor转化成CUDA或者CPU支持的tensor。

更多Pytorch知识梳理,请参考: pytorch学习笔记

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

以上是关于pytorch之张量的相关介绍的主要内容,如果未能解决你的问题,请参考以下文章

一文读懂PyTorch张量基础(附代码)

PyTorch 命名张量(Named Tensors)的介绍

PyTorch-20 命名张量(Named Tensors)的介绍

PyTorch-20 命名张量(Named Tensors)的介绍

深度之眼PyTorch训练营第二期 ---2张量操作与线性回归

深度之眼PyTorch训练营第二期 ---基础数据结构-张量