将图像输入批次扁平化为CNN

将图像输入批次扁平化为CNN

欢迎回到这个神经网络编程系列。在这篇文章中,我们将可视化一个单一灰度图像的张量扁平化操作,并且我们将展示如何扁平化特定的张量轴,这在使用CNN时通常是必需的,因为我们处理的是输入批次,而不是单个输入。

在这里插入图片描述

让我们开始吧。

扁平化整个张量

张量的扁平化操作是卷积神经网络中的常见操作。这是因为卷积层的输出在传递到全连接层之前必须被扁平化。

在之前的文章中,我们学习了张量的形状以及重塑操作。扁平化操作是一种特定类型的重塑操作,其中所有的轴都被_压缩_或_合并_在一起。

为了扁平化一个张量,我们至少需要两个轴。这使得我们从尚未扁平的东西开始。现在让我们看看一个手写的来自MNIST数据集的数字8图像。这个图像具有2​个不同的维度,高度_和_宽度


在这里插入图片描述

高度和宽度分别是18 x 18​。这些维度告诉我们这是一个裁剪后的图像,因为MNIST数据集包含28 x 28​的图像。现在让我们看看这两个轴的高度和宽度如何被扁平化为长度为324​的单一轴。

上面的图像展示了我们扁平化的输出,具有长度为324​的单一轴。边缘的白色对应于图像顶部和底部的白色。

在这个例子中,我们扁平化了整个张量图像,但如果我们只想扁平化张量内的特定轴呢?这在使用CNN时通常是必需的。

让我们看看我们如何在代码中扁平化张量的特定轴,使用PyTorch。

扁平化张量的特定轴

在关于CNN输入张量形状的文章中,我们学习了卷积神经网络的张量输入通常具有4​个轴,一个用于批次大小,一个用于颜色通道,每个用于高度和宽度。

(批次大小,通道,高度,宽度)

让我们从这里开始,构建一个符合这些规格的张量。首先,假设我们有以下三个张量。

构建图像批次的张量表示
t1 = torch.tensor([[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]
])t2 = torch.tensor([[2,2,2,2],[2,2,2,2],[2,2,2,2],[2,2,2,2]
])t3 = torch.tensor([[3,3,3,3],[3,3,3,3],[3,3,3,3],[3,3,3,3]
])

这些张量每个的形状都是4 x 4​,所以我们有三个秩为2的张量。在这里,我们将这三个4 x 4​图像视为可以通过CNN处理的批次。

记住,批次使用单个张量表示,所以我们需要将这三个张量合并为一个具有三个轴而不是2​的更大的张量。

> t = torch.stack((t1, t2, t3))
> t.shapetorch.Size([3, 4, 4])

在这里,我们使用了stack()​方法沿着一个新的轴连接我们的三个张量序列。由于我们在一个新的轴上有三个张量,我们知道这个轴的长度应该是3​,实际上,我们可以看到在形状中我们有3​个张量,它们的高度和宽度都是4​。

想知道stack()​方法如何工作吗?stack()​方法的解释将在本系列后面介绍。

长度为3​的轴代表批次大小,而长度为4​的轴分别代表高度和宽度。这就是这个张量批次表示的输出看起来的样子。

> t
tensor([[[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1]],[[2, 2, 2, 2],[2, 2, 2, 2],[2, 2, 2, 2],[2, 2, 2, 2]],[[3, 3, 3, 3],[3, 3, 3, 3],[3, 3, 3, 3],[3, 3, 3, 3]]])

此时,我们有一个包含三个4 x 4​图像的秩为3的张量。我们现在需要做的就是为这个张量添加一个颜色通道轴,以使其成为CNN所期望的形式。我们基本上为这些图像张量中的每一个都有一个隐含的单一颜色通道,所以实际上,这些将是灰度图像。

CNN期望看到一个明确的颜色通道轴,因此让我们通过重塑这个张量来添加一个。

> t = t.reshape(3,1,4,4)
> t
tensor(
[[[[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1]]],[[[2, 2, 2, 2],[2, 2, 2, 2],[2, 2, 2, 2],[2, 2, 2, 2]]],[[[3, 3, 3, 3],[3, 3, 3, 3],[3, 3, 3, 3],[3, 3, 3, 3]]]
))

注意到我们在批次大小轴之后指定了一个长度为1​的轴。然后,我们跟随高度和宽度轴,长度为4​。同时,注意到额外的长度为1​的轴并没有改变张量中元素的数量。这是因为当我们乘以一时,组成部分值的乘积不会改变。

第一个轴有3​个元素。第一个轴的每个元素代表一个图像。对于每个图像,我们在通道轴上有一个单一的颜色通道。这些通道中的每一个都包含4​个数组,包含4​个数字或标量组件。

让我们通过索引这个张量来查看。

我们有第一张图像。

> t[0]
tensor([[[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1]]))

我们有第一张图像中的第一个颜色通道。

> t[0][0]
tensor([[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1]])

我们有第一张图像中第一个颜色通道的第一行像素。

> t[0][0][0]
tensor([1, 1, 1, 1])

我们有第一张图像中第一个颜色通道第一行的第一个像素值。

> t[0][0][0][0]
tensor(1)
扁平化张量批次

好的。让我们看看如何扁平化这个批次中的图像。记住,整个批次是一个将被传递给CNN的单个张量,所以我们不想扁平化整个东西。我们只想扁平化批次张量中的图像张量。

让我们先扁平化整个东西,只是为了看看它会变成什么样子。另外,我想对那些在我们上一篇文章中提供了flatten()​函数替代实现的每个人大声说出来。看看。

> t.reshape(1,-1)[0]
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])> t.reshape(-1)
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])> t.view(t.numel())
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])> t.flatten()
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])

在底部,你会注意到另一种内置于张量对象的方法,叫做flatten()​。这种方法产生的输出与其他替代方案完全相同。

我想让你注意到这个输出,我们已经扁平化了整个批次,这将所有图像合并到了一个单一轴上。记住,_1_代表第一张图像的像素,_2_代表第二张图像,而_3_代表第三张图像。

这个扁平化的批次在我们的CNN内部不会很好地工作,因为我们需要对批次张量中的每张图像进行单独预测,现在我们有一个扁平化的混乱。

这里的解决方案是,在保持批次轴的同时扁平化每张图像。这意味着我们只想扁平化张量的一部分。我们想扁平化颜色通道轴以及高度和宽度轴。

这些轴需要被扁平化:(C,H,W)

这可以使用PyTorch的内置flatten()​方法完成。

扁平化张量的特定轴

让我们运行以下代码:

> t.flatten(start_dim=1).shape
torch.Size([3, 16])> t.flatten(start_dim=1)
tensor(
[[1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8],[2, 2, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8],[3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]
]
)

注意在调用中我们如何指定了start_dim​参数。这告诉flatten()​方法应该从哪个轴开始扁平化操作。这里的1是一个索引,所以它是第二个轴,即颜色通道轴。我们跳过了批次轴,保持它不变。

检查形状,我们可以看到我们有一个秩为2的张量,其中包含三个单通道图像,这些图像已经被扁平化为16​个像素。

扁平化RGB图像

如果我们扁平化一个RGB图像,颜色通道会发生什么?

每个颜色通道将首先被扁平化。然后,扁平化的通道将被排列在张量的单个轴上并排成一行。让我们看一个代码示例。

我们将构建一个高度为两像素,宽度为两像素的示例RGB图像张量。

r = torch.ones(1,2,2)
g = torch.ones(1,2,2) + 1
b = torch.ones(1,2,2) + 2img = torch.cat((r,g,b),dim=0
)

这给了我们想要的张量。我们可以通过检查形状来验证这一点:

> img.shape
torch.Size([3, 2, 2])

我们有三个颜色通道,高度和宽度都是两像素。我们也可以这样检查这个张量的数据:

> img
tensor([[[1., 1.],[1., 1.]],[[2., 2.], [2., 2.]],[[3., 3.],[3., 3.]]
])

现在,我们可以通过扁平化图像张量来看看这是什么样子。

> img.flatten(start_dim=0)
tensor([1., 1., 1., 1., 1., 2., 2., 2., 2., 2., 3., 3., 3., 3.])

注意,这里的start_dim​参数告诉flatten()​方法从哪里开始扁平化。在这个例子中,我们扁平化了整个图像。然而,我们也只扁平化通道,像这样:

> img.flatten(start_dim=1)
tensor([[1., 1., 1., 1.],[2., 2., 2., 2.],[3., 3., 3., 3.]
])

总结

我们现在应该对张量的扁平化操作有了很好的理解。我们知道如何扁平化整个张量,我们知道如何扁平化张量的特定维度/轴。我们将看到这在我们构建CNN时如何被利用。在那之前,我们下一篇见!

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

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

相关文章

精度论文:【Focaler-IoU: More Focused Intersection over Union Loss】

Focaler-IoU: 更聚焦的交并比损失 Focaler-IoU: More Focused Intersection over Union Loss Focaler-IoU: 更聚焦的交并比损失I. 引言II. 相关工作III. 方法IV. 实验V. 结论 原文地址:官方论文地址 代码地址:官方代码地址 摘要——边界框回归在目标检…

交直流混合微电网多台互联变换器并联

在交直流混合微电网中,多台互联变换器的并联操作是为了实现功率按比例分担。这样的系统通常涉及直流-直流(DC-DC)、直流-交流(DC-AC)以及交流-直流(AC-DC)变换器的组合。通过适当的控制策略&…

PyTorch使用教程(2)-torch包

1、简介 torch包是PyTorch框架最外层的包,主要是包含了张量的创建和基本操作、随机数生成器、序列化、局部梯度操作的上下文管理器等等,内容很多。我们基础学习的时候,只有关注张量的创建、序列化,随机数、张量的数学数学计算等常…

Matplotlib基础

概述 1、什么是Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进、交互式方式实现数据可视化 2、为什么要学习Matplotlib 可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法。 能将数据进行可视化,更直观的呈现使数据…

警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误

一直以来我认为工具类的软件是越新越好,因为工具代表着一定的先进性;但是IDEA 2024好好的给我上了一课,比如lombok 不起作用、比如Spring Boot 3.4.x 启动报错、再比如MyBatis log plus冲突、再比如Gradle插件冲突. 一、Lombok 失效问题 请不…

EI Scopus双检索 | 2025年第四届信息与通信工程国际会议(JCICE 2025)

会议简介 Brief Introduction 2025年第四届信息与通信工程国际会议(JCICE 2025) 会议时间:2025年7月25日-27日 召开地点:中国哈尔滨 大会官网:www.jcice.org 由黑龙江大学和成都信息工程大学主办,江苏科技大学协办的2025年第四届信…

JavaWeb 前端基础 html + CSS 快速入门 | 018

今日推荐语 指望别人的救赎,势必走向毁灭——波伏娃 日期 学习内容 打卡编号2025年01月17日JavaWeb 前端基础 html CSS018 前言 哈喽,我是菜鸟阿康。 今天 正式进入JavaWeb 的学习,简单学习 html CSS 这2各前端基础部分&am…

Flask学习入门笔记

Flask学习入门笔记 前言1. 安装Flask2. 创建一个简单的Flask应用3. 路由与视图函数3.1 基本路由3.2 动态路由3.3 HTTP方法 4. 请求与响应4.1 获取请求数据4.2 返回响应 5. 模板渲染5.1 基本模板渲染5.2 模板继承 6. 静态文件6.1 静态文件的目录结构6.2 在模板中引用静态文件6.2…

菜品管理(day03)

公共字段自动填充 问题分析 业务表中的公共字段: 而针对于这些字段,我们的赋值方式为: 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。 在更新数据时, 将updateTime 设置为当前时间…

Python股票量化交易分析-开发属于自己的指标

需求:股票的量化交易指标很多,我想做一个自己的量化交易图表: 展示每天交易量和股价振幅的关系图进一步的话想知道单位金额对股价振幅的影响,最终实现大概估计需要多少买入成交量能拉升多少股价) , 目前未…

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程,其中一个实例是讲如何爬取淘宝商品信息,现整理如下: 功能描述:获取淘宝搜索页面的信息,提取其中的商品名称和价格 探讨:淘宝的搜索接口 翻页的处理 技术路线:requests…

OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 为已校准的立体相机的每个头计算校正变换。 cv::stereoRectify 是 OpenCV 中用于立体校正的函数,它基于已知的相机参数和相对位置&am…

1.17组会汇报

STRUC-BENCH: Are Large Language Models Good at Generating Complex Structured Tabular Data? STRUC-BENCH:大型语言模型擅长生成复杂的结构化表格数据吗?23年arXiv.org 1概括 这篇论文旨在评估大型语言模型(LLMs)在生成结构…

【机器学习实战入门】使用 Pandas 和 OpenCV 进行颜色检测

Python 颜色检测项目 今天的项目将非常有趣和令人兴奋。我们将与颜色打交道,并在项目过程中学习许多概念。颜色检测对于识别物体来说是必要的,它也被用作各种图像编辑和绘图应用的工具。 什么是颜色检测? 颜色检测是检测任何颜色名称的过程…

【k8s面试题2025】3、练气中期

体内灵气的量和纯度在逐渐增加。 文章目录 在 Kubernetes 中自定义 Service端口报错常用控制器Kubernetes 中拉伸收缩副本失效设置节点容忍异常时间Deployment 控制器的升级和回滚日志收集资源监控监控 Docker将 Master 节点设置为可调度 在 Kubernetes 中自定义 Service端口报…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代,数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者,面临着一项艰巨的任务:如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…

redis 分布式重入锁

文章目录 前言一、分布式重入锁1、单机重入锁2、redis重入锁 二、redisson实现重入锁1、 添加依赖2、 配置 Redisson 客户端3、 使用 Redisson 实现重入锁4、 验证5、运行项目 三、redisson分布式锁分析1、获取锁对象2、 加锁3、订阅4、锁续期5、释放锁6、流程图 前言 通过前篇…

【git】如何删除本地分支和远程分支?

1.如何在 Git 中删除本地分支 本地分支是您本地机器上的分支,不会影响任何远程分支。 (1)在 Git 中删除本地分支 git branch -d local_branch_name git branch 是在本地删除分支的命令。-d是一个标志,是命令的一个选项&#x…

关于 Cursor 的一些学习记录

文章目录 1. 写在最前面2. Prompt Design2.1 Priompt v0.1:提示设计库的首次尝试2.2 注意事项 3. 了解 Cursor 的 AI 功能3.1 问题3.2 答案 4. cursor 免费功能体验5. 写在最后面6. 参考资料 1. 写在最前面 本文整理了一些学习 Cursor 过程中读到的或者发现的感兴趣…