钓鱼网站图片网站开发运行环境

当前位置: 首页 > news >正文

钓鱼网站图片,网站开发运行环境,美食网站开发的背景,精品域名更换Tensor 张量 Tensor#xff0c;中文翻译“张量”#xff0c;是一种特殊的数据结构#xff0c;与数组和矩阵非常相似。在 PyTorch 中#xff0c;使用张量对模型的输入和输出以及模型的参数进行编码。 Tensor 是一个 Python Class。PyTorch 官方文档中定义“Tensor#xff0…Tensor 张量 Tensor中文翻译“张量”是一种特殊的数据结构与数组和矩阵非常相似。在 PyTorch 中使用张量对模型的输入和输出以及模型的参数进行编码。 Tensor 是一个 Python Class。PyTorch 官方文档中定义“Tensor是一种包含单一数据类型元素的多维矩阵”。 官方TORCH.TENSORA torch.Tensor is a multi-dimensional matrix containing elements of a single data type. “张量” 看起来和矩阵比较相似但实际上“张量”  和线性代数中的 “矩阵” 并不相同。 理解“张量”最简单的方法是把它看成一个“多维数组”这个数组可以是 0 维即一个数值称为“标量”也可以是 1 维即一个常见的普通数组称为“矢量/向量”还可以是 2 维、3维、甚至 N 维 一维 import torch

一维

a torch.tensor([1, 2, 3, 4]) print(a) # tensor([1, 2, 3, 4]) print(a.shape) # torch.Size([4])

输出只有一个维度所以是一维。

二维 import torch

二维

a torch.tensor([[1, 2, 3, 4]]) print(a) # tensor([[1, 2, 3, 4]]) print(a.shape) # torch.Size([1, 4]) 上面输出有行和列所以它二维张量实际上就是一个二维矩阵。 三维 import torch

三维

a torch.ones(1, 3, 3) print(a) print(a.shape) 打印结果  tensor([[[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]]]) torch.Size([1, 3, 3]) 从输出结果可以看到这个张量是有三个维度的前面多了一个维度1。但无法直观看到这个1体现在哪里。下面再来看一个张量直观感受一下这个最前面的维度体现在哪里 import torch

三维

a torch.ones(3,4,5) print(a) print(a.shape) 打印结果  tensor([[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]]]) torch.Size([3, 4, 5])从上面输出结果可以直观感受到最前面维度数字3的体现 第一个数字3分成3大行 第二个数字4每一大行分为4小行 第三个数字5每一大行分为5小列 所以数据的维度是3×4×5最后一个数字表示列的维度我们也可以理解为3个4行5列的数据。 如果我们将上面的张量类比为一张RGB的图像数字3表示3个通道每个通道的大小为4行5列。 四维 import torch

四维

a torch.ones(2,3,4,5) print(a) print(a.shape) 打印结果 tensor([[[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]]],[[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.],[1., 1., 1., 1., 1.]]]]) torch.Size([2, 3, 4, 5]) 我们用分割线将上面的输出分开  红线上面一部分是一个“维度”下面又是一个“维度”所以是两个维度。 再直白一点就是张量a有2大行每大行又分了3小行每行又分了4行然后又分了5列。 张量a在日常图像数据集中可以这么理解 第一个数字2其实就是batch_size就相当于这个张量是输入了2张图像 第二个数字3每张图像的通道数是3 第三个数字4图像的高为4 第四个数字5图像的宽为5如下所示 N维数组的角度理解彩色图像 下面这个示例更直观的描绘了如何从 “ N 维数组 ” 的角度理解一张彩色图片 现实世界中的数据张量 向量数组(2D 张量) 这是最常见的数据。它是由向量组成的数组第一个轴是样本轴第二个轴是特征轴。 案例 人口统计数据集包括三个特征年龄、电话和收入。因此可以存储在形状为 (x, 3) 的 2D 张量中x 为统计人数。
时间序列数据(3D 张量) 当数据集中时间或序列顺序对于数据很重要时应该将数据存储在带有时间轴的 3D 张量中。每个样本可以被编码为一个向量序列即 2D 张量而一个数据批量就是一个 3D 张量。 案例 股票价格数据集。每一分钟我们记录股票的当前价格、上一分钟的最高价格和上一分钟的最低价格。整个交易日保存在形状为 (x, 3) 的 2D 张量x 统计时长中而 300 天的数据则可以保存在形状为(300, x, 3)的 3D 张量中。这里每个样本是一天的股票数据。
批图像数据(4D 张量) PIL image张量格式一般都是(W,H,C)而PyTorch的图像张量一般格式是(C,H,W)(C为通道数H为高W为宽)所以需要把它转换为PyTorch里面的张量形式。即有变换(W,H,C)–(C,H,W)。方法采用transforms.ToTensor()方法。         图像通常具有三个维度高度、宽度和颜色深度。虽然灰度图像比如 MNIST 数字图像 只有一个颜色通道因此可以保存在 2D 张量中。 如果图像大小为 256×256 128 张灰度图像组成的批量可以保存在一个形状为(128, 1, 256, 256 )的张量中 128 张彩色图像组成的批量则可以保存在一个形状为(128, 3, 256, 256)的张量中。 4 维张量在卷积神经网络中应用的非常广泛它用于保存特征图(Feature maps)数据格式一般定义为(PyTorch版本) [b,c,h,w] 其中表示输入的数量批次大小batch_sizeh/w分别表示特征图的高宽表示特征图的通道数。 图片数据是特征图的一种对于含有RGB 3 个通道的彩色图片每张图片包含了h 行w 列像素点每个点需要3 个数值表示RGB 通道的颜色强度因此一张图片可以表示为[3, h, w]。如下图所示最上层的图片表示原图它包含了下面3 个通道的强度信息。 神经网络中一般并行计算多个输入以提高计算效率故 张图片的张量可表示为 : [b,c,h,w] 对于4维张量的索引 张量的索引是从第零维度开始的。让我们来创建一个四维的张量做举例说明torch.Tensor(2,3,52,64) 此时这个张量可以表示两张高为52宽为64的彩色图像具体来说张量的第零维表示图像的数量第一维表示图像的颜色通道3即为彩色图片代表RGB三通道第二维和第三维代表图像的高度和宽度。此张量的索引代码如下 import torcha torch.Tensor(2, 3, 52, 64)

通过.shape的方法查看当前张量的形状

print(a.shape) print(a[0].shape) print(a[0][0].shape) print(a[0][0][0].shape) print(a[0][0][0][0].shape) 打印结果  torch.Size([2, 3, 52, 64]) # 图像的形状 torch.Size([3, 52, 64]) # 取到第一张图像形状为 [3, 52, 64] torch.Size([52, 64]) # 取到第一张图像的第一个颜色通道 形状为[52, 64] torch.Size([64]) # 取到第一张图像的第一个颜色通道的第一行像素值 torch.Size([]) # 取到第一张图像的第一个颜色通道的第一个像素值形状为0因为是标量对于四维张量的切片问题 在上一小节中维度的索引是取到某维度上的全部数据。但是如果我们只想要某维度上的部分数据应该怎么做呢这就是切片的作用。 切片方法的格式为tensor[ first : last : step] first与last为切片的起始和结束位置取值方法是按照step的间隔进行左闭右开的取值当间隔为1时step可以默认不写当取到该维度的所有数据时使用冒号即可。实例如下 import torcha torch.Tensor(2, 3, 64, 64)

通过.shape的方法查看当前张量的形状

print(a.shape) print(a[1:2, :, :, :].shape) print(a[ : , : , 0:32, 0:32].shape) print(a[ : , : , 0:32:2, 0:32:2].shape) print(a[ : , : , : : 2, : : 2].shape)打印结果  torch.Size([2, 3, 64, 64]) # 图像的形状 torch.Size([1, 3, 64, 64]) # 取到第二张图像 torch.Size([2, 3, 32, 32]) # 取到两张图像1/4大小的左上角子图 torch.Size([2, 3, 16, 16]) # 取到两张图像1/4大小的左上角子图后在子图上隔点取样 torch.Size([2, 3, 32, 32]) # 在原图上隔点取样张量的维度变换 在之后的学习中我们会发现每个算法模型都有自己要求的输入数据维度每个问题下的数据维度也不同。因为为了使用各种的算法来处理各种的问题往往需要对数据进行维度的变换。例如如果想用神经网络层来处理图像数据我们就可以发现图片是三维的数据维度颜色通道高度宽度但是神经网络层能接受的数据维度是二维此时维度是不匹配的因此需要将图像的空间维度打平成向量。下面介绍pytorch中一些常见的维度变换方法。 (1) view() 和 reshape() 变换维度 import torcha torch.Tensor(2, 3, 32, 32)print(a.view(2, 3, 32*32)) print(a.reshape(2, 3, 32*32)) print(a.reshape(2, 3, -1))print(a.view(2, 3, 32 * 32).shape) print(a.reshape(2, 3, 32 * 32).shape) print(a.reshape(2, 3, -1).shape) 打印结果 tensor([[[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.]],[[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.]]]) tensor([[[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.]],[[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.]]]) tensor([[[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.]],[[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.],[0., 0., 0., …, 0., 0., 0.]]])torch.Size([2, 3, 1024]) torch.Size([2, 3, 1024]) torch.Size([2, 3, 1024])view() 和reshape()都可以对某张量进行维度的变化但是reshape()方法的鲁棒性更强更推荐大家使用。此外view() 和reshape()接受的参数都是变换后的维度大小在设置变换后维度的参数时如果只剩一个维度没有给予可直接使用-1来代替pytorch会根据之前已设置的维度自动推导出最后未给予的维度。 import torch a torch.Tensor(2, 3, 32, 32) print(a.reshape(2, 3, 4,-1).shape) # 打印结果torch.Size([2, 3, 4, 256])最后这里需要注意的是变换后的总维度数量必须与变换前相等否则报错。实例如下所示 import torcha torch.Tensor(2, 3, 32, 32)print(a.reshape(2, 3, 10).shape)# RuntimeError: shape [2, 3, 10] is invalid for input of size 6144 (2) unsqueeze() 增加新的数据维度         有时候我们往往因为数据的增加需要在原始张量表示的基础上扩张维度来存储新增加的数据。举个例子我们创建一个小学年级的档案时可以创建一个三维张量[年级数量每年级的班级数量班级的人数] 此时我要合并另一所学校的年级档案最好的办法是在扩充出一个学校的维度变成四维张量[学校的数量年级数量每年级的班级数量班级的人数] 。 unsqueeze() 方法就是用来增加数据维度的接受的参数含义是在哪个维度之前增加新维度这个参数也支持负索引。具体实例如下 import torch a torch.Tensor(2, 3, 64, 64) print(a.unsqueeze(0).shape) print(a.unsqueeze(1).shape) print(a.unsqueeze(2).shape) print(a.unsqueeze(-1).shape)# output

torch.Size([1, 2, 3, 64, 64])

torch.Size([2, 1, 3, 64, 64])

torch.Size([2, 3, 1, 64, 64])

torch.Size([2, 3, 64, 64, 1])

(3) squeeze() 缩减数据维度         增加某张量维度的反操作是减少维度对于pytorch中的方法是squeeze()接受的参数是要进行维度缩减的维度索引注意缩减的维度值必须等于1否则不能进行缩减而且程序不报错实例如下 import torcha torch.Tensor(2, 1, 64, 64) print(a.squeeze(1).shape) print(a.squeeze(2).shape) # output

torch.Size([2, 64, 64])

torch.Size([2, 1, 64, 64]) (4) expand()和 repeat()在某维度上扩展数据         expand()可以在某维度上进行数据扩展扩展的方法是复制原始数据。需要注意的是expand()方法不能扩展维度大于1的维度否则报错。因为其扩展方式是复制当维度大于1时expand()方法不清楚应该复制哪个数据。具体实例如下 

import torch a torch.Tensor(2, 1, 64, 64) print(a.shape) print(a.expand(2, 3, 64, 64).shape) print(a.expand(2, 100, 64, 64).shape)# torch.Size([2, 1, 64, 64])

torch.Size([2, 3, 64, 64])

torch.Size([2, 100, 64, 64])print(a.expand(3, 1, 64, 64).shape)

RuntimeError: The expanded size of the tensor (3) must match the existing size (2) at non-singleton dimension 0. Target sizes: [3, 1, 64, 64]. Tensor sizes: [2, 1, 64, 64]repeat()也可以在某维度上进行数据扩展但是其接受的参数含义与expand()函数不同。repeat()函数接受的是在该维度上复制全部数据的次数实例如下

import torcha torch.Tensor(2, 1, 64, 64) print(a.shape) print(a.repeat(1,3,1,1).shape) print(a.repeat(3,3,3,3).shape)# output

torch.Size([2, 1, 64, 64])

torch.Size([2, 3, 64, 64])

torch.Size([6, 3, 192, 192])(5) transpose()和 permute()进行张量的维度调整         transpose()可以通过指定张量中某两个维度的索引来对这两个维度的数据进行交换维度操作示例如下

import torcha torch.Tensor(2, 3, 64, 64) print(a.shape) print(a.transpose(0, 1).shape) # output

torch.Size([2, 3, 64, 64])

torch.Size([3, 2, 64, 64])(6) Broadcastpytorch对不同维度张量进行计算时的自动补全规则         注意broadcast不是函数而是pytorch在加减两个不同维度张量时底层自动实现的计算逻辑。首先一个常识是当两个张量维度不同时是不能进行加减操作的。broadcast的主要思想是针对维度小的数据依次从最后一个维度开始匹配维度大的数据如果没匹配上则插入一个新的维度。举例如下         [2, 3, 32, 32] [3,1,1] 是不能直接相加的。         Broadcast机制会先将 [3,1,1] 增加新维度变为 1, 3, 1, 1然后再将 [1, 3, 1, 1]扩展维度为 2, 3, 32, 32 从某种程度上说broadcast机制等价于unsqueeze()和expand()两个方法的组合。目的是在处理两个维度不同的张量时可以显式的不做任何处理进行直接加减操作。实际上在底层隐式的进行了unsqueeze() 和 expand()。 注意broadcast机制也有限制当维度小的数据依次从最后一个维度开始匹配维度大的数据时小维度数据的维度值必须符合以下两种情况之一才能进行broadcast等于1或与大维度数据的维度值相等否则报错。示例如下

import torcha torch.Tensor(2,3,32,32) b torch.Tensor(1,1,1) c torch.Tensor(32) d torch.Tensor(32, 1) e torch.Tensor(2, 32, 32) print((a b).shape) # 运行成功 print((a c).shape) # 运行成功 print((a d).shape) # 运行成功 print((a e) .shape) # 报错# torch.Size([2, 3, 32, 32])

torch.Size([2, 3, 32, 32])

torch.Size([2, 3, 32, 32]) # RuntimeError: The size of tensor a (3) must match the size of tensor b (2) at non-singleton dimension 1

import torcha torch.Tensor(2, 3, 32, 32) d torch.Tensor(2, 32, 32) e torch.Tensor(1, 32, 32) print((a e) .shape) # 运行成功 print((a d).shape) # 报错# torch.Size([2, 3, 32, 32])

RuntimeError: The size of tensor a (3) must match the size of tensor b (2) at non-singleton dimension 1 参考自

微信公众号 Python新视野 10分钟看懂深度学习的基本数据类型——张量 微信公众号 板栗烧鸡翅【PyTorch笔记】基础知识Tensor 张量 https://blog.csdn.net/python_LC_nohtyp/article/details/104097182【DL】关于tensor张量的介绍和理解_机器不学习我学习的博客-CSDN博客【Pytorch基础(2)】张量的索引切片与维度变换_python 张量索引_lingchen1906的博客-CSDN博客