深度学习:卷积神经网络中的im2col

news2024/11/24 16:21:39

im2col 是一种在卷积神经网络(CNN)中常用的技术,用于将输入图像数据转换为适合卷积操作的矩阵形式。通过这种转换,卷积操作可以被高效地实现为矩阵乘法,从而加速计算。
在传统的卷积操作中,卷积核(滤波器)在输入图像上滑动,逐个计算每个位置的卷积结果。这种操作在计算上非常耗时,尤其是在处理大图像和大卷积核时。im2col 技术通过将输入图像数据重新排列成矩阵形式,使得卷积操作可以利用高效的矩阵乘法来实现

通过一个具体的例子来理解:

  • 输入数据为:

I = np.array([
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
],
[
[17, 18, 19, 20],
[21, 22, 23, 24],
[25, 26, 27, 28],
[29, 30, 31, 32]
],
[
[33, 34, 35, 36],
[37, 38, 39, 40],
[41, 42, 43, 44],
[45, 46, 47, 48]
] ]

  • 卷积核为:

K = np.array([
[
[1, 0, -1],
[2, 0, -2],
[1, 0, -1]
],
[
[1, 0, -1],
[2, 0, -2],
[1, 0, -1]
],
[
[1, 0, -1],
[2, 0, -2],
[1, 0, -1]
] ])

阅读书籍说是img2col会将输入数据中应用滤波器的区域(3维方块)横向展开为1列。
在这里插入图片描述在本例中输入数据中应用滤波器的区域为:

[[[1, 2, 3], [5, 6, 7], [9, 10, 11]], [[17, 18, 19], [21, 22, 23],
[25, 26, 27]], [[33, 34, 35], [37, 38, 39], [41, 42, 43]]]

[[[2, 3, 4], [6, 7, 8], [10, 11, 12]], [[18, 19, 20], [22, 23, 24],
[26, 27, 28]], [[34, 35, 36], [38, 39, 40], [42, 43, 44]]]

[[[5, 6, 7], [9, 10, 11], [13, 14, 15]], [[21, 22, 23], [25, 26, 27],
[29, 30, 31]], [[37, 38, 39], [41, 42, 43], [45, 46, 47]]]

[[[6, 7, 8], [10, 11, 12], [14, 15, 16]], [[22, 23, 24], [26, 27,
28], [30, 31, 32]], [[38, 39, 40], [42, 43, 44], [46, 47, 48]]]

按我个人理解是img2col会将输入数据转换为 4*27 的矩阵即
第一行为 1,2,3,5,6,7,9,10,11,17,18,19,21,22,23,25,26,27,33,34,35,37,38,39,41,42,43 即第一次卷积运算所涉及到的输入数据
第二行为 2,3,4,6,7,8,10,11,12,18,19,20,22,23,24,26,27,28,34,35,36,38,39,40,42,43,44 即第二次卷积运算所涉及到的输入数据
第三行,第四行类似就不列举出来了

x2 = np.random.rand(1, 3, 4, 4)
col2 = im2col(x2, 3, 3, stride=1, pad=0)
print(col2.shape)

结果为:

(4, 27)

若是批大小为10,即保存10倍的数据

x2 = np.random.rand(10, 3, 4, 4)
col2 = im2col(x2, 3, 3, stride=1, pad=0)
print(col2.shape)

结果为:

(40, 27)

为什么我会认为是那么展开的呢?
是因为后续书中给出滤波器(卷积核)的展开代码为col_K = K.reshape(FN,-1).T (FN为滤波器的数量,通过在reshape时指定为-1,reshape函数会自动计算-1维度上的元素个数,以使多维数组的元素个数前后一致。比如,(10, 3, 5, 5)形状的数组的元素个数共有750个,指定reshape(10,-1)后,就会转换成(10, 75)形状的数组)
本例对K进行运行:

col_K = K.reshape(1,-1).T
col_K

可得:

array([[ 1],
[ 0],
[-1],
[ 2],
[ 0],
[-2],
[ 1],
[ 0],
[-1],
[ 1],
[ 0],
[-1],
[ 2],
[ 0],
[-2],
[ 1],
[ 0],
[-1],
[ 1],
[ 0],
[-1],
[ 2],
[ 0],
[-2],
[ 1],
[ 0],
[-1]])

​而im2col作用是将输入图像数据转换为适合卷积操作的矩阵形式,故我认为是按上述转换方法展开输入数据(和不展开运算结果一样),这样之后便可将展开后的输入数据与展开后的卷积核进行矩阵乘法(后续还需要将输出大小转换为合适的形状),使得卷积操作可以被高效地实现为矩阵乘法。

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

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

相关文章

【论文阅读】Associative Alignment for Few-shot Image Classification

用于小样本图像分类的关联对齐 引用:Afrasiyabi A, Lalonde J F, Gagn C. Associative alignment for few-shot image classification[C]//Computer Vision–ECCV 2020: 16th European Conference, Glasgow, UK, August 23–28, 2020, Proceedings, Part V 16. Spri…

HCIP-HarmonyOS Application Developer V1.0 笔记(五)

弹窗功能 prompt模块来调用系统弹窗API进行弹窗制作。 当前支持3种弹窗API,分别为: 文本弹窗,prompt.showToast;对话框,prompt.showDialog;操作菜单,prompt.showActionMenu。 要使用弹窗功能&…

【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)

背景需求 最近带班,没有时间整理照片,偶尔导一次,几个月的照片。发现用电脑版“华为手机助手“中的WLAN连接”与华为手机的“华为手机助手”连接,速度更快、更稳定,不会出现数据线连接时碰碰就断网的问题 1、先打开电…

人工智能技术:未来生活的“魔法师”

想象一下,未来的某一天,你醒来时,智能助手已经为你准备好了早餐,你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐,而你的自动驾驶汽车已经在门口等你。这不是科幻小说,这是人工智能技术为我…

Golang | Leetcode Golang题解之第538题把二叉搜索树转换为累加树

题目: 题解: func getSuccessor(node *TreeNode) *TreeNode {succ : node.Rightfor succ.Left ! nil && succ.Left ! node {succ succ.Left}return succ }func convertBST(root *TreeNode) *TreeNode {sum : 0node : rootfor node ! nil {if n…

信号带宽和上升沿的关系:【图文讲解】

目录 1:什么是信号带宽 2:带宽计算公式 3:实际应用 这里讨论的信号,是指数字信号,默认为方波信号。 方波是一种非正弦曲线的波形,具有明确的“高”和“低”两个电平值,且占空比(…

大数据新视界 -- 大数据大厂之 Impala 性能优化:从数据压缩到分析加速(下)(8/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

SpringAI QuickStart

Spring AI 官方文档:Spring AI Spring AI 是一个面向 AI 工程的应用框架,其目标是将 Spring 生态系统的可移植性和模块化设计等设计原则应用到AI 领域,并推动将 POJO 作为应用的构建块应用于 AI 领域。 其特点是跨 AI 供应商支持的便携式 A…

Matplotlib | 条形图中的每个条形(patch)设置标签数据的方法

方法一 不使用子图对象如何给形图中的每个条形设置数据 plt.figure(figsize(8, 4)) sns.countplot(xWorkout_Frequency (days/week), datadf)plt.title(会员每周锻炼频率分布) plt.xlabel(锻炼频率 (每周次数)) plt.ylabel(人数)# 获取当前活动的轴对象 ax plt.gca()# 循环遍…

浅析Android Handler机制实现原理

0. 背景描述 Android系统出于对简单、高效的考虑,在设计UI体系时采用了单线程模型,即不会在多个线程中对同一个UI界面执行操作。简单是指单线程模型可以不用考虑和处理在多线程环境下操作UI带来的线程安全问题,高效是指单线程模型下无需通过…

美格智能5G车规级通信模组: 5G+C-V2X连接汽车通信未来十年

自2019年5G牌照发放开始,经过五年发展,我国5G在基础设施建设、用户规模、创新应用等方面均取得了显著成绩,5G网络建设也即将从基础的大范围覆盖向各产业融合的全场景应用转变。工业和信息化部数据显示,5G行业应用已融入76个国民经…

LINUX下的Mysql:Mysql基础

目录 1.为什要有数据库 2.什么是数据库 3.LINUX下创建数据库的操作 4.LINUX创建表的操作 5.SQL语句的分类 6.Mysql的架构 1.为什要有数据库 直接用文件直接存储数据难道不行吗?非得搞个数据库呢? 首先用文件存储数据是没错,但是文件不方…

使用yolov3配置文件训练自己的数据

目录 前言 一、准备数据集 二、创建文件结构 三、格式化文件 1.data文件夹 2.config文件夹 四、修改yolo的配置文件 1.train文件 2.json2yolo文件 3.datasets文件 前言 使用yolov3框架训练自己的数据大致分为这四步: 准备数据集创建文件结构格式化文件 …

vue组件在项目中的常用业务逻辑(3)

获取完后台接口数据后,需将数据在页面中进行动态展示。 一、在getters中简化数据: 二、在search>index.vue中写计算属性,实现将接口的goodsList模块数据展示在vue的search上: 三、1.用v-for循环数据,一共十个&…

改变自己最快的方式,就5个字,早践行早受益

学习和工作效率不高,总是被屏幕上突然弹出的各种消息扰乱大脑,打破既定节奏? 在如今这个娱乐至死的时代,短视频横行,网络聊天,吃喝玩乐极度便捷,娱乐触手可得,我们的注意力被太多东…

FLINK单机版安装部署入门-1

文章目录 FLINK单机版安装部署高于1.9.3需要修改配置文件flink-conf.yaml(低于1.9.3可以跳过)linux启动集群windows下启动Flink提交任务方式命令方式提交运行WordCount任务运行streaming任务 web页面提交任务取消Job java: Compilation failed: internal java compiler error高…

【Linux系列】Linux 和 Unix 系统中的`set`命令与错误处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python | Leetcode Python题解之第537题复数乘法

题目: 题解: class Solution:def complexNumberMultiply(self, num1: str, num2: str) -> str:real1, imag1 map(int, num1[:-1].split())real2, imag2 map(int, num2[:-1].split())return f{real1 * real2 - imag1 * imag2}{real1 * imag2 imag1…

同三维T610UHK USB单路4K60采集卡

USB单路4K60HDMI采集卡,支持1路4K60HDMI输入和1路4K60HDMI环出,1路MIC输入1路Line IN音频输入和1路音频输出,录制支持4K60、1080P120,TYPE-C接口,环出支持1080P240 HDR 一、产品简介: 同三维T610UHK是一款USB单路4K60HDMI采集卡,…