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

目录

PyTorch的数据类型:Tensor

函数查找

一、Tensor的创建

二、Tensor的运算

三、Tensor的操作

四、NumPy 转换

一、Tensor的创建

二、Tensor的运算

2.1 张量元素比较

2.2 基本运算

2.2.1 逐元素加减乘除

2.2.2 幂运算

2.2.3 指数对数运算

2.2.4 平方根及其倒数

2.2.5 数据的裁剪

 2.2.6 矩阵的运算

2.3 统计相关计算

2.4 其他的一些函数

三、Tensor的操作

(1)改变张量的形状

torch.reshape()

 torch.resize_()

torch.unsqueeze()和torch.squeeze()

(2)获取张量中的元素

切片索引法

获取A中大于5的元素 

筛选条件

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

(3)拼接与拆分

四、NumPy 转换

Torch Tensor转化为Numpy

Numpy转化为Torch 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)

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 在使用PyTorch进行机器学习或深度学习的过程中,将Tensor类型转化为图片是常见且必要的一步。PyTorch提供了很多方法将Tensor类型转化为图片,以下是其中的两种方法: 方法一:使用PIL库 通过PIL库将Tensor类型转化为图片是一种简单且高效的方法。以下是具体的实现步骤: 1. 首先,需要将Tensor类型转化为numpy数组。 2. 然后,将numpy数组转化为PIL图像。 3. 最后,将PIL图像保存为图片或者显示出来。 以下是代码示例: import torch from PIL import Image # 将Tensor类型转化为numpy数组 tensor = torch.randn(3, 256, 256) numpy_array = tensor.numpy() # 将numpy数组转化为PIL图像 image = Image.fromarray(numpy_array) # 保存图像 image.save('test.png') # 显示图像 image.show() 方法二:使用matplotlib库 matplotlib是一个常用的数据可视化库,其中包含了将Tensor类型转化为图片的方法。以下是具体的实现步骤: 1. 首先,需要将Tensor类型转化为numpy数组。 2. 然后,使用matplotlib的imshow函数将numpy数组显示为图像。 3. 最后,使用show函数显示出来。 以下是代码示例: import torch import matplotlib.pyplot as plt # 将Tensor类型转化为numpy数组 tensor = torch.randn(3, 256, 256) numpy_array = tensor.numpy() # 显示图像 plt.imshow(numpy_array) plt.show() 总结: 以上就是将Tensor类型转化为图片的两种方法。这些方法也可以用于将Tensor类型的数据可视化。在实际应用中,可以根据具体的情况选择合适的方法。 ### 回答2: PyTorch是一个流行的开源深度学习框架,用户可以将张量(tensor类型的数据输入到神经网络模型中进行训练并进行预测。在有些情况下,我们可能需要将张量数据转化为图片的形式进行可视化。 在PyTorch中,将张量类型转化为图片需要使用到PIL库,因此需要先安装PIL库。 一般而言,将张量转换为图片的步骤如下: 1.首先,我们需要有一个张量,该张量的形状应该为(N, C, H, W)。其中,N表示图片的数量,C表示图片的通道数(例如:灰度图像为1通道,RGB图像为3通道),H和W表示图片的高度和宽度。 2.接下来,我们需要将张量中的数值范围规范化到0到255之间,方便后续处理。如果张量的最大值和最小值不在0到255之间,我们可以使用torch.clamp()函数将张量数值限制在0到255之间。 3.外部PIL库需要将张量转换为图片格式的数字数组。因此,我们需要使用torch.Tensor.permute()函数将张量尺寸重新排列。如果使用的是彩色图像,则张量的尺寸应该为(N, H, W, C)。如果使用的是灰度图像,则张量的尺寸应该为(N, H, W)。 4.现在,我们可以使用PIL库中的Image.fromarray()函数将调整后的张量数据转化为图片。如果使用的是彩色图像,则需要设置参数mode='RGB'。如果使用的是灰度图像,则需要设置参数mode='L'。 5.最后,我们可以调用图片对象的save()函数将图片保存到本地文件中,或者调用show()函数在程序中显示转换后的图片。 下面是一个示例代码,将张量转换为图片并保存到本地: ``` import torch from PIL import Image # 定义一个4张,3通道,高为128,宽为128的随机张量 t = torch.randn(4, 3, 128, 128) # 将张量数值范围规范化到0~255之间 t = torch.clamp(t * 255, 0, 255) # 将张量尺寸重新排列,将通道数C放到最后一维 t = t.permute(0, 2, 3, 1) # 将张量转换为图片对象 img = Image.fromarray(t[0].cpu().numpy().astype('uint8'), mode='RGB') # 保存图片到本地 img.save('tensor_to_image.jpg') ``` 在上述示例代码中,我们首先定义一个随机纯色张量t,该张量的大小为(4, 3, 128, 128),即有4张128x128像素的三通道彩色图像。接下来,我们使用torch.clamp()函数将张量中的数字限制在0~255之间,再将张量尺寸重新排列,将通道数放到最后的维度。接着,我们使用PIL库中的Image.fromarray()函数将张量转换为图片对象img,该图片对象可以使用save()函数保存到本地文件,或者使用show()函数在程序中进行查看。 总之,将张量类型转化为图片的主要步骤是将张量尺寸重新排列,并使用PIL库将调整后的张量数据转换为图片格式的数字数组。这样便可以转换为可以呈现的图像。 ### 回答3: 在 PyTorch 中,将 Tensor 转化为图片主要分为两种情况:将 Tensor 保存为图片文件和在代码中将 Tensor 可视化为图片。以下分别介绍这两种情况的具体实现方法: 一、将 Tensor 保存为图片文件 1. 使用 PIL 库将 Tensor 转化为图片 首先需要导入 PIL 库: ``` from PIL import Image ``` 然后,将 Tensor 转化为 PIL 图片对象: ``` tensor_image = torch.tensor(image_data) # image_data 为 Tensor 格式的数据 pil_image = Image.fromarray(tensor_image.numpy()) ``` 最后将保存为图片: ``` pil_image.save("image.png") ``` 2. 使用 OpenCV 库将 Tensor 转化为图片 首先需要导入 OpenCV 库: ``` import cv2 ``` 然后,将 Tensor 转化为 cv2 图片对象: ``` tensor_image = torch.tensor(image_data) # image_data 为 Tensor 格式的数据 cv2_image = cv2.cvtColor(tensor_image.numpy(), cv2.COLOR_RGB2BGR) ``` 最后将保存为图片: ``` cv2.imwrite("image.png", cv2_image) ``` 二、在代码中将 Tensor 可视化为图片 在使用 PyTorch 进行神经网络训练的时候,可以使用一些工具库来可视化训练过程中的结果,例如使用 TensorBoard 或者使用 matplotlib 库可视化。以下是使用 matplotlib 库的方法: 首先需要导入 matplotlib 库: ``` import matplotlib.pyplot as plt ``` 然后,使用以下代码将 Tensor 可视化为图片: ``` plt.imshow(tensor_image.permute(1, 2, 0).cpu().numpy()) # tensor_image 为 Tensor 格式的数据 plt.show() ``` 在这里需要注意的是,如果 Tensor 的通道数为第一维,需要使用 `permute` 函数将通道维度移动到最后一维。如果 Tensor 存储在 GPU 上,需要使用 `cpu()` 函数将 Tensor 转移到 CPU 上后再进行可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天是冰红茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值