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

【深度学习】6-卷积过程中数据的结构变化

🚩 前言

在学习卷积神经网络时,我对于卷积过程中数据的结构变化常感困惑不解(如改变数组的维度顺序),因此在这里做一些整理。


文章目录

  • 🚩 前言
  • 多通道特征图
    • 1. 多通道的形成
    • 2. 相比普通的全连接层
  • 卷积批处理中数据的结构
    • 1. 卷积层的实现代码
    • 2. 数据的结构分析


多通道特征图

1. 多通道的形成

通过对一张图片应用一个滤波器(卷积核)进行卷积运算,我们将得到单通道的特征图。那么通过对一张图片应用多个滤波器,就可以得到多通道的特征图。

图片来自《深度学习入门:基于python的理论与实现》
卷积
因此,虽然我们作为输入数据的图片也有通道数,输出的特征图也有通道数,但它们其实在卷积过程中并不具有因果关系。输出特征图的通道数仅由所应用的滤波器的数量决定,而滤波器的数量是人为设定的超参数

即使输入的图片仅仅是单通道的二维数据,通过应用多个滤波器的卷积,同样可以得到多通道的特征图。特征图的不同通道之间,你可以把它们想象成核磁共振CT之间的关系(这个比喻可能不是很恰当)。

在这里插入图片描述

2. 相比普通的全连接层

在运用了多个滤波器时,我们会发现卷积网络层和之前多分类问题的结构很相似。实际上,有时一个滤波器就被称作一个权值

我们可以把卷积过程的一个滤波器的输出来和多分类中的一个输出y对比,发现它们都是利用到了所有的输入数据,然后得到一个输出。不同的是,多分类问题中每个输出只是那些所有输入数据的加权和;而卷积得到的一个输出是一个矩阵(代表一个通道),矩阵的每一个元素都是局部相邻的输入数据的加权和。

在这里插入图片描述

大量局部信息的保留对于图像的识别很有帮助,可以参考长文解析Resnet50的算法原理,这篇文章使用的是比较通俗易懂的写法。

卷积批处理中数据的结构

1. 卷积层的实现代码

# 用im2col来实现卷积层
class Convolution:
    def __init__(self, W, b, stride=1, pad=0):
        self.W = W
        self.b = b
        self.stride = stride
        self.pad = pad
        
    def forward(self, x):
        FN, C, FH, FW = self.W.shape
        N, C, H, W = x.shape
        out_h = int(1 + (H + 2 * self.pad - FH) / self.stride)
        out_w = int(1 + (W + 2 * self.pad - FW) / self.stride)
        
        # 输入数据横向展开,滤波器纵向展开
        col = im2col(x, FH, FW, self.stride, self.pad)
        col_W = self.W.reshape(FN, -1).T
        out = np.dot(col, col_W) + self.b
        
        out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)
        
        return out

2. 数据的结构分析

书上通常用不同的字母以及它们的顺序,来描述多维数据的结构。例如 ( C , H , W ) (C,H,W) (C,H,W),其中C表示通道数,H表示高,W表示宽。但有时仍感到有些晦涩,特别是当这些维度发生交换的时候,例如代码中的out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2)一句,为什么输出应该reshape ( N , H , W , C ) (N,H,W,C) (N,H,W,C)的形式?

这时,我们就需要一个例子来帮助我们理解它具体的过程。下面是处理一张单通道图片的例子。(前面说了输出数据的通道数只与滤波器的数量有关,因此我们这里的输入数据是单通道还是多通道其实关系不大

卷积im2col

图中,上面是没有进行 i m 2 c o l im2col im2col展开的卷积过程(方便直观理解),下面是进行了展开的过程(方便在计算机上实现)

  • reshape虽然可以改变数组的形状,但其实是受限于原来数据元素的顺序的,而只是重新进行了一次划分来改变维度。例如, [ 1 , 2 , 3 , 4 ] [1,2,3,4] [1,2,3,4]可以被重新划分为 [ [ 1 , 2 ] , [ 3 , 4 ] ] [ [1,2],[3,4] ] [[1,2],[3,4]]而变成二维数组,但却不能被重新划分为 [ [ 1 , 3 ] , [ 2 , 4 ] ] [ [1,3],[2,4] ] [[1,3],[2,4]]从这样的表示法来看,就是你只能改变括号,而不能改变数字的顺序)

于是在规则下,就催生了我们上面的过程来实现我们的目标。


感谢阅读

相关文章:

  • 牛客刷SQL
  • 如何高效的实现大型设备中卫星信号的传输和分配?
  • C语言描述数据结构 —— 二叉树(3)普通二叉树
  • Nginx rewrite
  • 【基于Arduino的垃圾分类装置开发教程一】
  • Synchronized 与 Lock 卖票问题、区别
  • 多疑型性格的危害,如何改变多疑型性格?
  • javaweb教师人事管理系统的设计
  • 【Swift 60秒】01 - Variables - 变量
  • 图像处理:单通道转为3通道
  • impala sql语法
  • 牛视系统源码定制,抖音矩阵系统定制开发。come here
  • 16 C++设计模式之职责链(Chain of Responsibility)模式
  • Kubernetes inotify watch 耗尽
  • LeetCode刷题(12)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • docker python 配置
  • js中forEach回调同异步问题
  • Less 日常用法
  • Object.assign方法不能实现深复制
  • Puppeteer:浏览器控制器
  • Redis的resp协议
  • Service Worker
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Terraform入门 - 3. 变更基础设施
  • 猴子数据域名防封接口降低小说被封的风险
  • 突破自己的技术思维
  • 一道面试题引发的“血案”
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #1014 : Trie树
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (39)STM32——FLASH闪存
  • (42)STM32——LCD显示屏实验笔记
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (九十四)函数和二维数组
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十六)一篇文章学会Java的常用API
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)Java算法:二分查找
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .Net Core和.Net Standard直观理解
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net连接oracle数据库
  • .Net面试题4
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .project文件