PyTorch实战-实现神经网络图像分类基础Tensor最全操作详解(一)

目录

前言

一、PyTorch数据结构-Tensor

1.什么是Tensor

2.数据Tensor使用场景

3.张量形态

标量(0D 张量)

 向量(1D 张量)

矩阵(2D张量)

3D 张量与高维张量

二、Tensor的创建

1. 从列表或NumPy数组创建

 2. 使用特定的初始化方法

 3. 从已有的Tensor创建

 三、Tensor的形状操作

1.查看大小和维度

2. 改变 Tensor 的形状

3. 移除和增加Tensor 的维度

 4.交换Tensor 维度

 5.拼接和堆叠Tensor

  6.拆分Tensor

 四、Tensor索引和切片

1.索引

 2.切片

3.通过索引和切片修改 Tensor

(1).修改单个元素的值

 (2).修改整行或整列

4.高级索引

(1).使用列表作为索引

 (2).使用布尔值作为索引(掩码)

 (3).使用 torch 的索引函数

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢


前言

PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架可以类比为编程语言,仅为我们实现项目效果的工具,也就是我们造车使用的轮子,我们重点需要的是理解如何使用Torch去实现功能而不要过度在意轮子是要怎么做出来的,那样会牵扯我们太多学习时间。以后就出一系列专门细解深度学习框架的文章,但是那是较后期我们对深度学习的理论知识和实践操作都比较熟悉才好开始学习,现阶段我们最需要的是学会如何使用这些工具。

深度学习的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容,我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。


博主专注数据建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏。

一文速学-数学建模常用模型


 


一、PyTorch数据结构-Tensor

1.什么是Tensor

Tensor是PyTorch中最基本的数据结构,可以看作是一个多维数组(矩阵的扩展)。与NumPy中的数组类似,与其不同的是ndarrays不能使用GPU加速计算但Tensor可以在GPU上运行,这使得它在深度学习领域特别强大,归根结底还是得依赖庞大的算力支持我们才能尽可能得到更加精准的数据,通常我们叫它张量。

2.数据Tensor使用场景

没有引入张量这个概念之前,大家其实就在很多场景接触到了这些数据。了解到张量以后大家自然而然的就会明白了。张量这一概念的核心在于,它是一个数据容器。它包含的数据几乎总是数值数据,因此它是数字的容器。你可能对矩阵很熟悉,它是二维张量。张量是矩阵向任意维度的推广[注意,张量的维度(dimension)通常叫作轴(axis)]。

以下是一些常见的使用场景:

  • 神经网络的构建和训练:神经网络的输入、权重、输出、梯度等都是以Tensor的形式表示。PyTorch、TensorFlow等深度学习框架都是基于Tensor进行运算的。
  • 图像处理:图像通常以多维数组的形式表示,例如RGB图像可以表示为高度、宽度和3个颜色通道的Tensor。
  • 自然语言处理:在处理文本数据时,可以将文本编码成Tensor,每个单词可以映射为一个数字或一个词向量。
  • 时间序列分析:例如股票价格、天气数据等,可以表示成时间、特征维度的Tensor。
  • 推荐系统:用户-物品交互矩阵可以表示为一个二维的Tensor。
  • 强化学习:在Q-learning等算法中,状态、动作、奖励等信息都可以用Tensor表示。
  • 计算机视觉任务:如目标检测、分割、人脸识别等任务,输入图像、特征图、目标框坐标等都可以用Tensor表示。视频为5D张量,形状为 (samples, frames, height, width, channels) 或 (samples,frames, channels, height, width) ,图片4D张量形状为 (samples, height, width, channels) 或 (samples, channels,height, width) 。
  • 自动驾驶和机器人控制:传感器数据(如摄像头、激光雷达等)可以表示成Tensor,用于训练和实时控制。
  • 生成对抗网络(GAN):GAN中的生成器和判别器都是基于神经网络和Tensor进行训练和推断的。
  • 聚类和降维:在数据挖掘和特征工程中,Tensor可以用于聚类、主成分分析(PCA)等算法。

总的来说,Tensor作为多维数组,适用于几乎所有涉及到大规模数值计算和深度学习的领域。

这里借助numpy给大家更加直观的认识张量。

3.张量形态

标量(0D 张量)

一个只包含单个数字的张量被称为标量(scalar),也叫做标量张量、零维张量或0D张量。在NumPy中,一个float32或float64类型的数字就是一个标量张量(或标量数组)。你可以通过查看一个NumPy张量的ndim属性来了解它的轴数。标量张量具有0个轴(ndim == 0)。轴的数量也被称为阶数(rank)。以下是一个NumPy标量的例子。

import numpy as np
x = np.array(1)
print("数组中轴的个数:{}".format(x.ndim))
print(x)

数组中轴的个数:0
1

 向量(1D 张量)

  数字组成的数组叫作向量(vector)或一维张量(1D 张量)。一维张量只有一个轴。下面是一个 Numpy 向量。

x = np.array([1, 4, 7, 10, 13])
print("数组中轴的个数:{}".format(x.ndim))
print(x)

数组中轴的个数:1
[ 1  4  7 10 13]

这里需要注意一下,这个数组成为5D向量但不是5D张量,前者是数量上的数量,后者是轴的数量,大家不要搞混。

矩阵(2D张量)

 向量组成的数组叫作矩阵(matrix)或二维张量(2D 张量)。矩阵有 2 个轴(通常叫作行和列)。你可以将矩阵直观地理解为数字组成的矩形网格。下面是一个 Numpy 矩阵。

x = np.array([[1, 8, 21, 3, 78],[8, 12, 13, 32, 11],[7, 3, 5, 6, 2]])
print("数组中轴的个数:{}".format(x.ndim))
print(x)

数组中轴的个数:2
[[ 1  8 21  3 78][ 8 12 13 32 11][ 7  3  5  6  2]]

3D 张量与高维张量

将多个矩阵组合成一个新的数组,可以得到一个 3D 张量,你可以将其直观地理解为数字组成的立方体。下面是一个 Numpy 的 3D 张量。

x = np.array([[[5, 78, 2, 34, 0],[6, 79, 3, 35, 1],[7, 80, 4, 36, 2]],[[5, 78, 2, 34, 0],[6, 79, 3, 35, 1],[7, 80, 4, 36, 2]],[[5, 78, 2, 34, 0],[6, 79, 3, 35, 1],[7, 80, 4, 36, 2]]])
print(x.ndim)
print(x)

3
[[[ 5 78  2 34  0][ 6 79  3 35  1][ 7 80  4 36  2]][[ 5 78  2 34  0][ 6 79  3 35  1][ 7 80  4 36  2]][[ 5 78  2 34  0][ 6 79  3 35  1][ 7 80  4 36  2]]]

 以后我们接触到相应的数据进行张量转换的时候大家会了解的更为清晰,那么我们现在知道张量的基础概念和形式了,可以尝试着用Torch进行创建。

二、Tensor的创建

在PyTorch中,我们可以通过多种方式创建Tensor:

1. 从列表或NumPy数组创建

import torch
import numpy as np# 从列表创建
tensor_from_list = torch.Tensor([1, 2, 3, 4])# 从NumPy数组创建
numpy_array = np.array([1, 2, 3, 4])
tensor_from_numpy = torch.Tensor(numpy_array)
tensor_from_numpy

tensor([1., 2., 3., 4.])

 2. 使用特定的初始化方法

# 创建一个形状为(3, 2)的随机Tensor
random_tensor = torch.randn(3, 2)# 创建一个全零的Tensor
zero_tensor = torch.zeros(3, 2)# 创建一个全1的Tensor
ones_tensor = torch.ones(3, 2)
# 创建一个从 0 到 9 的等差数列
tensor5 = torch.arange(0, 10, 1)
# 创建一个从 0 到 1 的 5 个数的均匀间隔的数列
tensor6 = torch.linspace(0, 1, 5)
print(tensor6)
print(random_tensor)
print(zero_tensor)
print(ones_tensor)
print(tensor5)
print(tensor6)

tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000])
tensor([[ 0.9255,  1.3031],[-1.2245, -0.5758],[-1.2821, -0.3471]])
tensor([[0., 0.],[0., 0.],[0., 0.]])
tensor([[1., 1.],[1., 1.],[1., 1.]])
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
tensor([0.0000, 0.2500, 0.5000, 0.7500, 1.0000])

 3. 从已有的Tensor创建

# 从已有的Tensor创建新的Tensor(共享内存)
new_tensor = torch.Tensor(random_tensor.size())
print(new_tensor)

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

 三、Tensor的形状操作

1.查看大小和维度

有两个函数size()和shape都可以查看:

random_tensor.size()
#random_tensor.shape 二者结果一致

torch.Size([3, 2])

2. 改变 Tensor 的形状

# 创建一个大小为 (2, 3) 的 Tensor
tensor = torch.arange(6).view(2, 3)
# 或者使用 reshape
# tensor = torch.arange(6).reshape(2, 3)
print(tensor)

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

3. 移除和增加Tensor 的维度

# squeeze 用于移除大小为 1 的维度
tensor = torch.arange(6).view(1, 2, 3)
squeezed_tensor = tensor.squeeze()
print(squeezed_tensor)# unsqueeze 用于增加维度
tensor = torch.arange(6).view(2, 3)
unsqueeze_tensor = tensor.unsqueeze(0)
print(unsqueeze_tensor)

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

 4.交换Tensor 维度

# 交换维度
tensor = torch.arange(6).view(2, 3)
transposed_tensor = tensor.transpose(0, 1)  # 交换维度 0 和 1
print(transposed_tensor)

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

 5.拼接和堆叠Tensor

# cat 用于在指定维度上连接多个 Tensor
tensor1 = torch.arange(3)
tensor2 = torch.arange(3, 6)
concatenated_tensor = torch.cat((tensor1, tensor2), dim=0)
print(concatenated_tensor)# stack 用于在新的维度上堆叠多个 Tensor
stacked_tensor = torch.stack((tensor1, tensor2), dim=0)
print(stacked_tensor)

  6.拆分Tensor

原Tensor:

tensor = torch.arange(10).view(2, 5)
print(tensor)

 拆分结果

# split 用于在指定维度上拆分 Tensor
tensor = torch.arange(10).view(2, 5)
split_tensors = torch.split(tensor, 2, dim=1)
print(split_tensors)# chunk 用于在指定维度上将 Tensor 拆分成相等的几块
chunked_tensors = torch.chunk(tensor, 2, dim=0)
print(chunked_tensors)

 

(tensor([[0, 1],[5, 6]]), tensor([[2, 3],[7, 8]]), tensor([[4],[9]]))
(tensor([[0, 1, 2, 3, 4]]), tensor([[5, 6, 7, 8, 9]]))

 四、Tensor索引和切片

1.索引

import torch# 创建一个二维 Tensor
tensor = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 访问单个元素
print(tensor[0, 0])  # 输出 1# 访问某一行
print(tensor[1])  # 输出 [4, 5, 6]# 访问某一列
print(tensor[:, 1])  # 输出 [2, 5, 8]# 使用逗号分隔访问多个不连续的元素
print(tensor[0, 0], tensor[1, 1], tensor[2, 2])  # 输出 1, 5, 9

 

tensor(1.)
tensor([4., 5., 6.])
tensor([2., 5., 8.])
tensor(1.) tensor(5.) tensor(9.)

 2.切片

# 使用切片获取子张量
print(tensor[0:2, 1:3])  # 输出 [[2, 3], [5, 6]]# 使用步长获取间隔元素
print(tensor[::2])  # 输出 [[1, 2, 3], [7, 8, 9]]# 使用负数索引倒序访问
print(tensor[-1])  # 输出 [7, 8, 9]

 

tensor([[2., 3.],[5., 6.]])
tensor([[1., 2., 3.],[7., 8., 9.]])
tensor([7., 8., 9.])

3.通过索引和切片修改 Tensor

(1).修改单个元素的值

# 创建一个二维 Tensor
tensor = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 修改单个元素的值
tensor[0, 0] = 0
tensor

 

tensor([[0., 2., 3.],[4., 5., 6.],[7., 8., 9.]])

 (2).修改整行或整列

整行修改:

# 创建一个二维 Tensor
tensor = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 修改整行或整列
tensor[1] = torch.Tensor([10, 11, 12])
tensor

 整列修改:

# 创建一个二维 Tensor
tensor = torch.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 修改整行或整列
tensor[:, 2] = torch.Tensor([30, 31, 32])
tensor

 

tensor([[ 1.,  2., 30.],[ 4.,  5., 31.],[ 7.,  8., 32.]])

4.高级索引

(1).使用列表作为索引

idx = [0, 2]
print(tensor[idx])  # 输出第 0 和第 2 行

 

tensor([[ 1.,  2., 30.],[ 7.,  8., 32.]])

 (2).使用布尔值作为索引(掩码)

mask = tensor > 5
print(tensor[mask])  # 输出所有大于 5 的元素

 

tensor([30., 31.,  7.,  8., 32.])

 (3).使用 torch 的索引函数

# 使用 torch 的索引函数
idx = torch.LongTensor([0, 2])
print(torch.index_select(tensor, 0, idx))  # 输出第 0 和第 2 行

 

tensor([[ 1.,  2., 30.],[ 7.,  8., 32.]])

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分拣平台API安全治理实战 | 京东物流技术团队

导读 本文主要基于京东物流的分拣业务平台在生产环境遇到的一些安全类问题,进行定位并采取合适的解决方案进行安全治理,引出对行业内不同业务领域、不同类型系统的安全治理方案的探究,最后笔者也基于自己在金融领域的经验进行了关于API网关治…

学习记忆——英语篇

文章目录 英语字母形象起源右脑记忆单词的原则四大步骤第一步:摄取信息第二步:处理信息第三步:储存信息第四步:提取信息 训练例子字母形象训练 右脑记忆单词5大方法字源法编码法字母编码法字母组合编码法 拼音法全拼法拼音组合 熟…

Navicat连接openGauss数据库报错

错误信息:fe_sendauth:invalid authentication request from server:AUTH_REQ_SASL_CONT without AUTH_REQ_SASL 解决步骤: 1)关闭防火墙: 切换root用户执行:su - root 输入密码 systemctl status firewalld 查…

神经网络 01(介绍)

一、神经网络 人工神经网络 (Artificial Neural Network,简写为ANN)也简称为神经网络 (NN),是一种模仿生物神经网络结构和功能的 计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号&#xff0c…

Vue3事件处理

文章目录 Vue3事件处理1. 概念2. 实例2.1 点击按钮次数12.2 v-on 可以接收一个定义的方法来调用2.3 内联 JavaScript 语句2.4 事件处理程序中调用多个方法 3. 事件修饰符4. 按键修饰符 Vue3事件处理 1. 概念 使用 v-on 指令来监听 DOM 事件,从而执行 JavaScript 代…

计算机网络初识

目录 1、计算机网络背景 网络发展 认识 "协议" 2、网络协议初识 OSI七层模型 TCP/IP五层(或四层)模型 3、网络传输基本流程 网络传输流程图 数据包封装和分用 4、网络中的地址管理 认识IP地址 认识MAC地址 1、计算机网络背景 网络发展 在之前呢&…

【C语言】库宏offsetof

一.offsetof简介 因此,宏offsetof的作用是: 当你传入结构体的类型及其成员时,它会返回该成员在结构体中的偏移量. 二.offsetof的使用 如下,我们使用offsetof打印一下结构体foo中,成员a,成员b及成员c相对于首地址的偏移量分别是多少: #include <stdio.h> #include …

模板学堂|数据可视化仪表板大屏设计流程梳理

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场&#xff08;https&#xff1a;//dataease.io/templates/&#xff09;。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板&#xff0c;方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&a…

更多场景、更多选择,Milvus 新消息队列 NATS 了解一下

在 Milvus 的云原生架构中&#xff0c;消息队列&#xff08;Log Broker&#xff09;可谓任重道远&#xff0c;它不仅要具备流式数据持久性、支持 TT 同步、事件通知等能力&#xff0c;还要确保工作节点从系统崩溃中恢复时增量数据的完整性。 在 Milvus 的架构中&#xff0c;一切…

中国各省市相关图标

中国各省市相关图标

预约到家按摩小程序开发定制同城服务

随着生活节奏加快&#xff0c;生活压力也随之而来&#xff0c;很多人忙于工作与生计&#xff0c;身体和心理两方面都在承受重压。而按摩能够消除身体的疲惫&#xff0c;增强人的身体体质&#xff0c;在劳累过后放松身心按摩一会儿&#xff0c;可以快速恢复精神状态&#xff0c;…

Leetcode376. 摆动序列

Every day a Leetcode 题目来源&#xff1a;376. 摆动序列 解法1&#xff1a;动态规划 约定&#xff1a; 某个序列被称为「上升摆动序列」&#xff0c;当且仅当该序列是摆动序列&#xff0c;且最后一个元素呈上升趋势。某个序列被称为「下降摆动序列」&#xff0c;当且仅当…

C++vector模拟实现

vector模拟实现 1.构造函数2.拷贝构造3.析构赋值运算符重载4.iterator5.modifiers5.1push_back5.2pop_back5.3empty5.4insert5.5erase5.6swap 6.Capacity6.1size6.2capacity6.3reserve6.4resize6.5empty 7.Element access7.1operator[]7.2at 8.在谈reserve vector官方库实现的是…

SQL11 高级操作符练习(1)

描述 题目&#xff1a;现在运营想要找到男性且GPA在3.5以上(不包括3.5)的用户进行调研&#xff0c;请你取出相关数据。 示例&#xff1a;user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.036543female20北京大学3.242315female23浙…

向量范数及其Python代码

【向量范数】 向量由于既有大小又有方向&#xff0c;所以不能直接比较大小。 向量范数通过将向量转化为实数&#xff0c;然后进行向量的大小比较。 所以&#xff0c;向量范数是用于度量“向量大小”的量。 设向量 &#xff0c;则有&#xff1a; ● 向量的 范数&#xff1a; ●…

Python计算机Python二级知识点整理

1. 此时我们这里首先解析一下这个d[A]N,根据ASCII表&#xff0c;我们可以看出字符A对应的十进制数字是65&#xff0c;ord()函数是把字符转换为相对应的ASCII码&#xff0c;chr()函数是ord()函数的逆运算&#xff0c;所以ord("A")65 ,chr(65)A,题目中首先定义了d为一…

C++毕业设计基于QT实现的超市收银管理系统源代码+数据库

C毕业设计基于QT实现的超市收银管理系统源代码数据库 编译使用 编译完成后&#xff0c;需要拷贝 file目录下的数据库 POP.db文件到可执行程序目录下 登录界面 主界面 会员管理 完整代码下载地址&#xff1a;基于QT实现的超市收银管理系统源代码数据库

笔记本多拓展出一个屏幕

一、首先要知道&#xff0c;自己的电脑有没有Type-c接口&#xff0c;支持不支持VGA 推荐&#xff1a; 自己不清楚&#xff0c;问客服&#xff0c;勤问。 二、显示屏与笔记本相连&#xff0c;通过VGA 三、连接好了&#xff0c;需要去配置 网址&#xff1a;凑合着看&#xff…

LLM 02-大模型的能力

LLM 02-大模型的能力 我们将深入探讨GPT-3——这个具有代表性的大型语言模型的能力。我们的研究主要基于GPT-3论文中的基准测试&#xff0c;这些测试包括&#xff1a; 标准的自然语言处理&#xff08;NLP&#xff09;基准测试&#xff0c;例如问题回答&#xff1b;一些特殊的一…

【OpenCV • c++】图像噪音 | 椒盐噪音 | 高斯噪音

文章目录 一、什么是图像噪音二、椒盐噪声三、高斯噪声 一、什么是图像噪音 图像噪声是图像在获取或是传输过程中受到随机信号干扰&#xff0c;妨碍人们对图像理解及分析处理的信号。很多时候将图像噪声看做多维随机过程&#xff0c;因而描述噪声的方法完全可以借用随机过程的描…