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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习模型入门教程指南

在当前的人工智能生成内容(AIGC)领域中,深度学习模型无疑是支撑其技术核心的关键组件。深度学习模型的广泛应用极大地推动了图像生成、自然语言处理和自动化工作流的发展,本文将从多个角度介绍深度学习模型的概念、构建过程、实际…

计算机网络:网络层 —— IPv4 数据报的首部格式

文章目录 IPv4数据报的首部格式IPv4数据报分片生存时间 TTL字段协议字段首部检验和字段 IPv4数据报的首部格式 IPv4 数据报的首部格式及其内容是实现 IPv4 协议各种功能的基础。 在 TCP/IP 标准中,各种数据格式常常以32比特(即4字节)为单位来描述 固定部分&#x…

Java_Springboot核心配置详解

Spring Boot以其简洁、高效和约定优于配置的理念,极大地简化了Java应用的开发流程。在Spring Boot中,核心配置是应用启动和运行的基础。本文将详细介绍Spring Boot中的两种配置文件格式、基础注解的配置方式、自定义配置以及多环境配置。 一、Spring Bo…

【GESP】C++一级知识点研究,cout和printf性能差异分析

一道简单循环输出练习题(BCQM3148,循环输出),由于cout的代码超时问题,让我注意到二者在使用上的差异,遂查阅研究如下。 全文详见:https://www.coderli.com/gesp-knowledge-cout-printf/【GESP】C一级知识点研究&#…

【网络安全】揭示 Web 缓存污染与欺骗漏洞

未经许可,不得转载。 文章目录 前言污染与欺骗Web 缓存污染 DoS1、HTTP 头部超大 (HHO)2、HTTP 元字符 (HMC)3、HTTP 方法覆盖攻击 (HMO)4、未键入端口5、重定向 DoS6、未键入头部7、Host 头部大小写规范化8、路径规范化9、无效头部 CP-DoS10、HTTP 请求拆分Web 缓存污染与有害…

《数字图像处理基础》学习03-图像的采样

在之前的学习中我已经知道了图像的分类:物理图像和虚拟图像。《数字图像处理基础》学习01-数字图像处理的相关基础知识_图像处理 数字-CSDN博客 目录 一,连续图像和离散图像的概念 二,图像的采样 1, 不同采样频率采样同一张图…

微服务实战系列之玩转Docker(十七)

导览 前言Q:如何实现etcd数据的可视化管理一、创建etcd集群1. 节点定义2. 集群成员2.1 docker ps2.2 docker exec2.3 etcdctl member list 二、发布数据1. 添加数据2. 数据共享 三、可视化管理1. ETCD Keeper入门1.1 简介1.2 安装1.2.1 定义compose.yml1.2.2 启动ke…

MobileNetv2网络详解

背景: MobileNet v1中DW卷积在训练完之后部分卷积核会废掉,大部分参数为“0” MobileNet v2网络是由Google团队在2018年提出的,相比于MobileNet v1网络,准确率更高,模型更小 网络亮点: Inverted Residu…

巨好看的登录注册界面源码

展示效果 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widthdevic…

机械臂建模之DH表

本文配图 取自哔哩哔哩机器人学视频 林沛群老师的PPT 机械臂几何直观描述 首先要知道DH表中四个参数的含义&#xff1a; 对于 a 、 α 、 d 、 θ i a、 \alpha 、 d 、 \theta_i a、α、d、θi​ 四个参数&#xff0c;上图采用MDH的方式&#xff0c;对于一个轴的这四个参数&a…

Flink CDC系列之:学习理解核心概念——Data Pipeline

Flink CDC系列之&#xff1a;学习理解核心概念——Data Pipeline 数据管道sourcesink管道配置Table IDroutetransform案例 数据管道 由于 Flink CDC 中的事件以管道方式从上游流向下游&#xff0c;因此整个 ETL 任务被称为数据管道。 管道对应于 Flink 中的一系列操作。 要描…

Git 本地操作(2)

会以下操作就可以完成本地的版本控制了&#xff0c;就不需要再复制文件每次改一个东西就复制整个工程保存下来啦&#xff01; 建议先看上一篇文章噢 &#xff01;&#xff01;&#xff01; 一、新建项目git本地操作 1、初始化仓库 创建一个 project 文件夹&#xff0c;将需…

Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景

介绍 网络爬虫&#xff08;Web Crawler&#xff09;是自动化的数据采集工具&#xff0c;用于从网络上提取所需的数据。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;很多网站增加了复杂的防护机制&#xff0c;使得数据采集变得更加困难。在这种情况下&#xff0c;Pyt…

Linux中NFS配置

文章目录 一、NFS介绍1.1、NFS的工作流程1.2、NFS主要涉及的软件包1.3、NFS的主要配置文件 二、安装NFS2.1、更新yum2.2、安装NFS服务2.3、配置NFS服务器2.4、启动NFS服务2.5、配置防火墙&#xff08;如果启用了防火墙&#xff0c;需要允许NFS相关的端口通过&#xff09;2.6、生…

MATLAB发票识别系统

课题介绍 该课题为基于MATLAB的发票识别系统。主要识别发票的编号。可定做发票的日期&#xff0c;金额等字段的识别。通过输入图片&#xff0c;校正&#xff0c;定位目标区域&#xff0c;分割&#xff0c;字符分割&#xff0c;模板匹配识别&#xff0c;得出结果。整个设计包含…

前端拖拽库方案之react-beautiful-dnd

近期&#xff0c;知名 React 拖拽库 react-beautiful-dnd 宣布了项目弃用的决定&#xff0c;未来将不再维护。这一决定源于其存在的缺陷与局限性&#xff0c;促使作者转向开发一个更加现代化的拖拽解决方案——Pragmatic drag and drop&#xff08;下面会介绍&#xff09;&…

Rust 力扣 - 643. 子数组最大平均数 I

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的最大和即可&#xff0c;遍历过程中刷新最大值 结果为窗口长度为k的最大和 除以 k 题解代码 impl Solution {pub fn find_max_average(nums: Vec<…

Linux——五种IO模型

目录 一IO基本理解 二五种IO模型 1五种IO模型示意图 2同步IO和异步IO 二非阻塞IO 1fcntl 2实现非阻塞IO 三多路复用 1select 1.1定位和作用 1.2介绍参数 1.3编写多路复用代码 1.4优缺点 2poll 2.1作用和定位 2.2介绍参数 2.3修改select代码 3epoll 3.1介绍…

php解密,sg11解密-sg15解密 如何由sourceGuardian11-sourceGuardian15加密(sg11加密~sg15加密)的源码

sg11加密~sg11加密的PHP文件运行需安装SG11加密-SG15加密组件使用、支持WINDOW及LINUX各版本 sg11解密(SourceGuardian)-sg15解密(SourceGuardian)&#xff0c;号称目前最安全的组件加密已可以解密&#xff0c;解密率99.9%&#xff0c;基本可以直接使用&#xff0c;代码特征是…