0


深度学习03:PyTorch的数据类型Tensor

PyTorch的数据类型:Tensor

Tensor,即张量,它是PyTorch中基本的操作对象,简单的理解就是多维矩阵。Tensors与Numpy中的 ndarrays类似,但是在PyTorch中 Tensors 可以使用GPU进行计算。

函数查找

每个章节涉及的函数已经归纳在下方,可以随时查找用法。

一、Tensor的创建

torch.Tensor()torch.DoubleTensor()torch.FloatTensor()torch.IntTensor()torch.zeros()torch.ones()torch.eye()torch.randn()torch.empty()torch.randperm()torch.**_like()
torch.ones_like()
torch.zeros_like()
torch.rand_like() torch.range()torch.full()

二、Tensor的运算

2.1 张量元素比较
torch.allclose()torch.eq()torch.equal()torch.ge()torch.gt()torch.le()torch.lt()torch.ne()torch.isnan()
2.2 基本运算
torch.pow()torch.exp()torch.log()torch.sqrt()torch.rsqrt()torch.clamp_max()torch.clamp_min()torch.clamp()torch.linspace()torch.matmul()torch.t()torch.inverse()
2.3 统计相关计算
torch.max()torch.argmax()torch.min()torch.argmin()torch.mean()torch.sum()torch.cumsum()torch.median()torch.std()torch.cumprod()torch.sort()torch.topk()torch.kthvalue()
2.4 其他的一些函数
torch.abs()torch,div()torch.add()torch.mm()torch.mv()

三、Tensor的操作

(1)改变张量的形状
torch.reshape()A.resize_()torch.squeeze()torch.unsqueeze()
(2)获取张量中的元素
torch.where()torch.tril()torch.triu()torch.diag()
(3)拼接与拆分
torch.cat()torch.stack()torch.chunk()torch.split()

四、NumPy 转换

torch.from_numpy()torch.numpy()

一、Tensor的创建

#创建指定大小
torch.Tensor(3.2,2.4)
#指定类型
torch.DoubleTensor(3,2)
torch.FloatTensor([2,3,4,5])
torch.IntTensor(2,2)
#列表生成
torch.Tensor([1,2],[2,3])
#0矩阵
torch.zeros(3,2)
#1矩阵
torch.ones(3,2)
#对角1矩阵
torch.eye(2,2)
#创建一个未被初始化数值的张量
torch.empty(2,2)
#随机张量
torch.randn(2,2)
#随机排列张量
torch.randperm(5)
#生成与D同样大小和类型的张量
torch.**_like(D)
    #比如:
        torch.ones_like(D)
        torch.zeros_like(D)
        torch.rand_like(D)  
        #——与torch.randn一样生成的是标准正态分布的随机张量
#生成某一范围的张量
torch.range(1,20,2)
    #起始——终止——步长
#0.25全填充
torch.full((3,3),fill_value=0.25)

二、Tensor的运算

2.1 张量元素比较

#比较两个元素是否接近
torch.allclose()
#逐元素比较是否相等
torch.eq()
#判断两个张量是否具有相同的形状和元素
torch.equal()
#逐元素比较大于等于
torch.ge()
#逐元素比较大于
torch.gt()
#逐元素比较小于等于
torch.le()
#逐元素比较小于
torch.lt()
#逐元素比较不等于
torch.ne()
#判断是否为缺失值
torch.isnan()

在这里,只需要知道就可以了,如果有需要的时候可以翻书和查函数手册。

2.2 基本运算

张量的基本运算方式,一种是逐元素之间的运算,如加减乘除、幂运算、平方根、对数、数据裁剪等;另一种为矩阵之间的运算,如矩阵相乘、矩阵的转置、矩阵的迹等。

2.2.1 逐元素加减乘除

import torch
A=torch.arange(6.0).reshape(2,3)
B=torch.linspace(10,20,steps=6).reshape(2,3)

print("A:",A)
print("B:",B)
C=A+B
print("逐元素相加:",C)
D=A-B
print("逐元素相减:",D)
E=A*B
print("逐元素相乘:",E)
F=B//A
print("逐元素整除:",F)
A: tensor([[0., 1., 2.],
        [3., 4., 5.]])
B: tensor([[10., 12., 14.],
        [16., 18., 20.]])
逐元素相加: tensor([[10., 13., 16.],
                [19., 22., 25.]])
逐元素相减: tensor([[-10., -11., -12.],
                [-13., -14., -15.]])
逐元素相乘: tensor([[  0.,  12.,  28.],
                [ 48.,  72., 100.]])
逐元素整除: tensor([[inf, 12.,  7.],
                [ 5.,  4.,  4.]])

2.2.2 幂运算

计算张量的幂可以使用torch.pow(),或者**运算

print(torch.pow(A,3))
print(A**3)
tensor([[  0.,   1.,   8.],
        [ 27.,  64., 125.]])
tensor([[  0.,   1.,   8.],
        [ 27.,  64., 125.]])

2.2.3 指数对数运算

#计算张量的指数
torch.exp(A)

#计算张量的对数
torch.log(A)
tensor([[  1.0000,   2.7183,   7.3891],
        [ 20.0855,  54.5981, 148.4132]])
tensor([[  -inf, 0.0000, 0.6931],
        [1.0986, 1.3863, 1.6094]])

2.2.4 平方根及其倒数

#计算张量的平方根
print(torch.sqrt(A))
print(A**0.5)
#计算张量的平方根倒数
print(torch.rsqrt(A))
print(1 / (A**0.5))
tensor([[0.0000, 1.0000, 1.4142],
        [1.7321, 2.0000, 2.2361]])
tensor([[0.0000, 1.0000, 1.4142],
        [1.7321, 2.0000, 2.2361]])
tensor([[   inf, 1.0000, 0.7071],
        [0.5774, 0.5000, 0.4472]])
tensor([[   inf, 1.0000, 0.7071],
        [0.5774, 0.5000, 0.4472]])

2.2.5 数据的裁剪

#根据最大值裁剪
print(torch.clamp_max(A,4))
#根据最小值裁剪
print(torch.clamp_min(A,3))
#根据范围裁剪
print(torch.clamp(A,2.5,4))
tensor([[0., 1., 2.],
        [3., 4., 4.]])
tensor([[3., 3., 3.],
        [3., 4., 5.]])
tensor([[2.5000, 2.5000, 2.5000],
        [3.0000, 4.0000, 4.0000]])

2.2.6 矩阵的运算

#矩阵的转置
C=torch.t(A)
print("矩阵的转置",C)
#矩阵相乘,A的行数要等于C的列数
print("矩阵相乘",A.matmul(C))
矩阵的转置 tensor([[0., 3.],
        [1., 4.],
        [2., 5.]])
矩阵相乘 tensor([[ 5., 14.],
        [14., 50.]])

若A x B = I,I为单位矩阵,则可称A和B互为逆矩阵;一个方阵中,对角线元素的和称为矩阵的迹。

C=torch.rand(3,3)
#矩阵的逆
D=torch.inverse(C)
print("C:",C,"\n","D:",D)
#矩阵的迹
torch.trace(torch.arange(9.0).reshape(3,3))
C: tensor([[0.9020, 0.8445, 0.5127],
        [0.4689, 0.5106, 0.8877],
        [0.7195, 0.3104, 0.5277]]) 
 D: tensor([[-0.0288, -1.3566,  2.3101],
        [ 1.8526,  0.5072, -2.6532],
        [-1.0505,  1.5515,  0.3060]])

tensor(12.)

2.3 统计相关计算

#计算张量中的最大值
torch.max()
#计算张量中的最大值位置
torch.argmax()
#计算张量中的最小值
torch.min()
#计算张量中的最小值位置
torch.argmin()
  1. torch.mean() #指定维度计算平均值
  2. torch.sum() #指定维度求和
  3. torch.cumsum() #指定维度进行累加和
  4. torch.median() #指定维度求中位数
  5. torch.cumprod() #指定维度计算累乘积
  6. torch.std() #张量标准差
#张量排序,分别输出从小到大,与原来对应索引位
A=torch.tensor([12,34,25,11,67,32,29,30,99,55,23,44])
torch.sort(A)
torch.return_types.sort(
values=tensor([11, 12, 23, 25, 29, 30, 32, 34, 44, 55, 67, 99]),
indices=tensor([ 3,  0, 10,  2,  6,  7,  5,  1, 11,  9,  4,  8]))
#降序排列
torch.sort(A,descending=True)
torch.return_types.sort(
values=tensor([99, 67, 55, 44, 34, 32, 30, 29, 25, 23, 12, 11]),
indices=tensor([ 8,  4,  9, 11,  1,  5,  7,  6,  2, 10,  0,  3]))
#获取张量前几个大的数值以及索引
torch.topk(A,4)
torch.return_types.topk(
values=tensor([99, 67, 55, 44]),
indices=tensor([ 8,  4,  9, 11]))
#获取张量第k小的数值和位置
torch.kthvalue(A,3)
torch.return_types.kthvalue(
values=tensor(23),
indices=tensor(10))

2.4 其他的一些函数

  • torch.abs:返回输入参数的绝对值
  • torch.add:用于返回张量与张量或张量与标量的和的Tensor
  • torch,div:返回输入参数求商的结果,可以是Tensor与Tensor,Tensor与标量
  • torch.mm:矩阵的相乘
  • torch.mv:返回输入参数的求积结果作为输出,按照矩阵与向量之间的乘法规则,第一个参数为矩阵,第二个参数为向量,不能颠倒

三、Tensor的操作

(1)改变张量的形状

torch.reshape()

A=torch.arange(12).reshape(3,4)
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])

对于已经生成的可以采用下面的方式

torch.reshape(input=A,shape=(2,-1))

torch.resize_()

A.resize_(2,6)
tensor([[ 0,  1,  2,  3,  4,  5],
        [ 6,  7,  8,  9, 10, 11]])

还提供了A.resize_as_(B),可以将A的形状设置为与B相同的形状大小。

torch.unsqueeze()和torch.squeeze()

  • torch.unsqueeze()函数在指定维度插入尺寸为1的新张量
  • torch.squeeze()函数移除所有维度为1的维度
A=torch.arange(12).reshape(2,6)
B=torch.unsqueeze(A,dim=0)
print("B.shape",B.shape)
C=B.unsqueeze(dim=3)
print("C.shape",C.shape)
D=torch.squeeze(C)
print("D.shape",D.shape)
#移除指定维度为1的维度
E=torch.squeeze(C,dim=0)
print("E.shape",E.shape)
B.shape torch.Size([1, 2, 6])
C.shape torch.Size([1, 2, 6, 1])
D.shape torch.Size([2, 6])
E.shape torch.Size([2, 6, 1])

(2)获取张量中的元素

切片索引法

import torch
A=torch.arange(12).reshape(1,3,4)
print(A)
print("0维度",A[0])
print("获取0维度下的矩阵前两行元素\n",A[0,0:2,:])
print("获取0维度下最后一行的-4至-1列\n",A[0,-1,-4:-1])
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]]])
0维度 tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
获取0维度下的矩阵前两行元素
 tensor([[0, 1, 2, 3],
        [4, 5, 6, 7]])
获取0维度下最后一行的-4至-1列
 tensor([ 8,  9, 10])

**获取A中大于5的元素 **

A[A>5]
tensor([ 6,  7,  8,  9, 10, 11])

筛选条件

B=-A
torch.where(A>5,A,B) #当A>5时为True,返回A的值,否则会返回B的值
tensor([[[ 0, -1, -2, -3],
         [-4, -5,  6,  7],
         [ 8,  9, 10, 11]]])

上三角、下三角及对角线元素

#获取矩阵下三角
print(torch.tril(A,diagonal=0))
#diagonal控制要考虑的对角线
print(torch.tril(A,diagonal=-1))
#获取上三角
print(torch.triu(A,diagonal=0))
#获取对角线元素
C=A.reshape(3,4)
print(torch.diag(C,diagonal=0))
print(torch.diag(C,diagonal=-1))
tensor([[[ 0,  0,  0,  0],
         [ 4,  5,  0,  0],
         [ 8,  9, 10,  0]]])
tensor([[[0, 0, 0, 0],
         [4, 0, 0, 0],
         [8, 9, 0, 0]]])
tensor([[[ 0,  1,  2,  3],
         [ 0,  5,  6,  7],
         [ 0,  0, 10, 11]]])
tensor([ 0,  5, 10])
tensor([4, 9])

(3)拼接与拆分

A=torch.arange(6.0).reshape(2,3)
B=torch.linspace(0,10,6).reshape(2,3)
#在0维度连接张量
C=torch.cat((A,B),dim=0)
C
tensor([[ 0.,  1.,  2.],
        [ 3.,  4.,  5.],
        [ 0.,  2.,  4.],
        [ 6.,  8., 10.]])
  • torch.stack(),可以将多个张量按照指定的维度进行拼接
  • torch.chunk(),可以将张量分割为特定数量的块
  • torch.split(),将张量分割为特定数量的块,可以指定每个块的大小

四、NumPy 转换

将一个Torch Tensor转化为Numpy数组是一件轻松的事,反之亦然。

Torch Tensor与Numpy数组共享底层内存地址,修改一个会导致另一个的变化。

Torch Tensor转化为Numpy

a=torch.ones(5)
print(a)
b=a.numpy()
print("ndarray",b)
tensor([1., 1., 1., 1., 1.])
ndarray [1. 1. 1. 1. 1.]

Numpy转化为Torch Tensor

a=numpy.ones(5)
b=torch.from_numpy(a)
print("n:",a)
print("t:",b)

n: [1. 1. 1. 1. 1.]

t: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)


本文转载自: https://blog.csdn.net/m0_62919535/article/details/128447189
版权归原作者 夏天是冰红茶 所有, 如有侵权,请联系我们删除。

“深度学习03:PyTorch的数据类型Tensor”的评论:

还没有评论