文章目录

  • 简介
    • 为什么要用卷积
    • 卷积神经网络的由来
  • 什么是卷积
    • 定义
    • 解释
  • 卷积运算
    • 信号分析
    • 离散卷积例子:丢骰子
    • 图像处理卷积操作

简介

为什么要用卷积

卷积操作是机器视觉,乃至整个深度学习的核心。首先看为什么卷积这么厉害。

我们所有的图片,如灰度图,每一个像素点都有一个灰度值,构成一个矩阵。设长宽为28像素,则该矩阵大小为28*28。

对于彩色图片也一样,他是由rbg三种颜色构成,我们看成三张像素图,也就是三个灰度图的矩阵就行了(其实为一张,一个矩阵,其大小为28∗28∗328*28*328∗28∗3)。

对于传统的神经网络,我们先要把图片拉平,也就是输入为784个数,然后进行隐藏层的参数的迭代更新,最终输出结果为10个数字。

这里设有四个隐藏层,每个隐藏层有256个节点,现在我们想算其参数量,咋算?

参数量为下面链接线的条数:784∗250+256∗256∗3+256∗10=390k784*250+256*256*3+256*10=390k784∗250+256∗256∗3+256∗10=390k。

一般我们用四个字节的浮点数表示其参数,所以这个神经网络需要的内存为:390k∗4=1.56MB390k*4=1.56MB390k∗4=1.56MB


神经网络发明于20世纪80年代,当时的计算机内存最多也就几百kb,所以即使这种简单的神经网络也是远远不够的(这也决定了为什么神经网络前期发展缓慢,而近几年发展异常的快)。

卷积神经网络的由来

所以伟大的科学家借鉴生物的注意力机制,提出来卷积神经网络的概念。

比如这个小孩视野是很宽旷的,但他的感受野(也就是注意力)完全集中在蛋糕上了,所以对蛋糕的记忆深刻,当然其感受野再看到别的地方时,也会有所记忆。

再比如我们看风景时其实也不可能一眼全完整个眼前风景,而是我们不断扫描这些风景(很快啊,风景也没有闪),然后经过神经系统的处理,就在我们大脑中成了图像。

什么是卷积

定义

在泛函分析中,卷积是通过两个函数f和g 生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。

数学定义:

  1. 连续函数:s(n)=∫f(t)g(n−t)dt=(f∗g)(n)s(n)=\int f(t)g(n-t)dt=(f*g)(n)s(n)=∫f(t)g(n−t)dt=(f∗g)(n)
  2. 离散定义:s(n)=∑f(t)g(n−t)=(f∗g)(n)s(n)=\sum f(t)g(n-t)=(f*g)(n)s(n)=∑f(t)g(n−t)=(f∗g)(n)

解释

对卷积这个名词的理解:所谓两个函数的卷积,本质上就是先将一个函数翻转,然后进行滑动叠加。

在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和,为简单起见就统一称为叠加。

整体看来是这么个过程:

翻转——>滑动——>叠加——>滑动——>叠加——>滑动——>叠加…

多次滑动得到的一系列叠加值,构成了卷积函数。

卷积运算

卷积运算公式看上去难以理解,所有我们最好要拿出实例来对其进行更直观的理解。

信号分析

如下图所示,输入信号是 f(t) ,是随时间变化的。系统响应函数是 g(t)g(t)g(t) ,图中的响应函数是随时间指数下降的,它的物理意义是说:如果在t=0t=0t=0的时刻有一个输入,那么随着时间的流逝,这个输入将不断衰减。换言之,到了 t=T时刻,原来在 t=0 时刻的输入f(0)的值将衰减为f(0)g(T)f(0)g(T)f(0)g(T)。


​​考虑到信号是连续输入的,也就是说,每个时刻都有新的信号进来,所以,最终输出的是所有之前输入信号的累积效果。如下图所示,在T=10时刻,输出结果跟图中带标记的区域整体有关。

其中,f(10)因为是刚输入的,所以其输出结果应该是f(10)g(0),而时刻t=9的输入f(9),只经过了1个时间单位的衰减,所以产生的输出应该是 f(9)g(1),如此类推,即图中虚线所描述的关系。这些对应点相乘然后累加,就是T=10时刻的输出信号值,这个结果也是f和g两个函数在T=10时刻的卷积值。


​​显然,上面的对应关系看上去比较难看,是拧着的,所以,我们把g函数对折一下,变成了g(-t),这样就好看一些了。看到了吗?这就是为什么卷积要“卷”,要翻转的原因,这是从它的物理意义中给出的。

上图虽然没有拧着,已经顺过来了,但看上去还有点错位,所以再进一步平移T个单位,就是下图。它就是本文开始给出的卷积定义的一种图形的表述:

​​所以,在以上计算T时刻的卷积时,要维持的约束就是: t+ (T-t) = T 。这种约束的意义,大家可以自己体会。

离散卷积例子:丢骰子

比如有两枚骰子,把这两枚骰子都抛出去,问:把这两枚骰子的点数之和为4的概率为多少?

这里问题的关键是,两个骰子加起来要等于4(两个函数生成一个函数),这正是卷积的应用场景。

我们把骰子各个点数出现的概率表示出来:

所以共三种情况:


因此,两枚骰子点数加起来为4的概率为:

符合卷积的定义,把它写成标准的形式就是:

但以上还是不直观,如果我们将函数g进行一下翻转:

由上图可以看到,函数 g 的滑动,带来的是点数和的增大。这个例子中对f和g的约束条件就是点数和,它也是卷积函数的自变量。

因为每个骰子的每个点数出现的概率是均等的,那么两个骰子的点数和n=7的时候,概率最大。

图像处理卷积操作

在卷积神经网络中,卷积的第一个参数(函数)称为输入(input),第二个参数(函数)叫做核函数(kernel function),输出通常称为特征映射

在机器学习中,输入通常是多维的数据,而核通常也是由学习算法优化得到的多维数组的参数(多维数组也就是张量)。

比如我们把一个二维图像I作为输入,其中K肯定也是一个二维的核函数,由此得到的输出为(图像的每个像素点都是独立的,所以要用离散卷积):

S(i,j)=(I∗K)(i,j)=∑∑I(m,n)K(i−m,j−n)S(i,j)=(I*K)(i,j)=\sum\sum I(m,n)K(i-m,j-n)S(i,j)=(I∗K)(i,j)=∑∑I(m,n)K(i−m,j−n)

如下图我们以像素点矩阵的形式将其表示。

对图像的处理函数(如平滑,或者边缘提取),也可以用一个g矩阵来表示,如设有一个3*3的卷积核对其进行卷积运算,对前三行三列运算的话,所以m=n=3m=n=3m=n=3,:

[b2,2b2,1b2,0b1,2b1,1b1,0b0,2b0,1b0,0]\left[ \begin{matrix} b_{2,2}& b_{2,1}&b_{2,0}\\ b_{1,2} &b_{1,1} & b_{1,0} \\ b_{0,2}&b_{0,1}& b_{0,0} \end{matrix} \right] ⎣⎡​b2,2​b1,2​b0,2​​b2,1​b1,1​b0,1​​b2,0​b1,0​b0,0​​⎦⎤​

注意,我们在处理平面空间的问题,已经是二维函数了,相当于:

  • f(x,y)=ax,yf(x,y)=a_{x,y}f(x,y)=ax,y​
  • g(x,y)=bx,yg(x,y)=b_{x,y}g(x,y)=bx,y​

那么函数f和g的在(u,v)处的卷积 [公式] 该如何计算呢?

按卷积的定义,二维离散形式的卷积公式应该是:

从卷积定义来看,应该是在x和y两个方向去累加(对应上面离散公式中的i和j两个下标),而且是无界的,从负无穷到正无穷。可是,真实世界都是有界的。例如,上面列举的图像处理函数g实际上是个3x3的矩阵,意味着,在除了原点附近以外,其它所有点的取值都为0。考虑到这个因素,上面的公式其实退化了,它只把坐标(u,v)附近的点选择出来做计算了。所以,真正的计算如下所示:


​​首先我们在原始图像矩阵中取出(u,v)处的矩阵:

然后将图像处理矩阵翻转(这个翻转有点意思,可以有几种不同的理解,其效果是等效的:(1)先沿x轴翻转,再沿y轴翻转;(2)先沿x轴翻转,再沿y轴翻转;),转换下步骤也行,具体如下:


计算卷积时,就可以用fff和 g′g'g′ 的内积:

请注意,以上公式有一个特点,做乘法的两个对应变量a,b的下标之和都是(u,v),其目的是对这种**加权求和进行一种约束。**这也是为什么要将矩阵g进行翻转的原因。

以上矩阵下标之所以那么写,并且进行了翻转,是为了让大家更清楚地看到跟卷积的关系。这样做的好处是便于推广,也便于理解其物理意义。实际在计算的时候,都是用翻转以后的矩阵,直接求矩阵内积就可以了。

以上计算的是(u,v)处的卷积,延x轴或者y轴滑动,就可以求出图像中各个位置的卷积,其输出结果是处理以后的图像(即经过平滑、边缘提取等各种处理的图像)。

再具体点,其具体实现如下:

对于灰度图像,上面我们也说了,其本质就是一个二维矩阵(h*l),比如下面,设该矩阵的其中一个维度的值为abcd…,wxyz为卷积核,他俩相乘相加就得到了一个新的函数(在这里是新矩阵)。


更直观的动态图:

动手学pytorch之通俗易懂何为卷积-深度AI科普团队相关推荐

  1. pytorch实战案例-手写数字分类-卷积模型——深度AI科普团队

    文章目录 数据准备 导入需要的模块 使用GPU训练 将数据转换为tensor 导入训练集和测试集 数据加载器 数据展示 创建模型 将模型复制到GPU 损失函数 定义训练和测试函数 开始训练 源码已经上 ...

  2. 小白学深度之LSTM长短期记忆神经网络——深度AI科普团队

    前言 不知道RNN的一定要先看看RNN的原理 在RNN中我们说了RNN的不足,也就是对较长的时间,或者较长的string,很多时候前面的数据对后面的数据影响就很小甚至没影响了,这是我们就要加强前面的数 ...

  3. pytorch实战案例-手写数字分类-全链接模型——深度AI科普团队

    文章目录 @[TOC] 数据准备 导入需要的模块 将数据转换为tensor 导入训练集和测试集 数据加载器 数据展示 创建模型 定义损失函数 定义优化函数 定义训练和测试函数 开始训练 源码已经上传: ...

  4. 从V1到V4,让你读懂YOLO原理——深度AI科普团队

    文章目录 YOLO概述 模型时间轴 YOLOv1 原理 网络结构 损失函数 激活函数 YOLOv1的缺陷 YOLOv2 Better Batch Normalization(批归一化) High Re ...

  5. 决策树随笔-深度AI科普团队

    决策树原理 决策树是一种多功能的机器学习算法,它可以实现分类和回归任务,甚至是多输出任务.它们功能强大,能够拟合 复杂的数据集. -优点:简单直观,基本不需要预处理,不用会议华,处理缺失值,精度高.对 ...

  6. 支持向量机——深度AI科普团队

    1. 支持向量机(SVM) 支持向量机是一个功能强大并且全面的机器学习模型,它能够执行线性或非线性分类.回归,甚至是异常值检测任务.SVM特别适用于中小型复杂数据集的分类. 什么是机?什么是向量?什么 ...

  7. 呕心沥血干完K-Means聚类——深度AI科普团队

    K-Means简介 K-Means 是一种非监督学习. K 代表的是 K 类,Means 代表的是中心,它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好. 主要思想 ...

  8. 图像分割总体介绍——深度AI科普团队

    概览 初识图像分割 顾名思义,图像分割就是指将图像分割成多个部分.在这个过程中,图像的每个像素点都和目标的种类相关联.图像分割方法主要可分为两种类型:语义分割和实例分割.语义分割会使用相同的类标签标注 ...

  9. 从数学基础到贝叶斯理论到实践——深度AI科普团队

    贝叶斯网络(Bayesian network)又被称为信念网络( Belief network),是一种通过有向无环图( Directed acyclic graph, DAG)表示一组随机变量及其条 ...

最新文章

  1. setstate是同步还是异步_【vert.x准备篇1】同步和异步,阻塞和非阻塞概念澄清
  2. 零基础小白如何学习好UI设计
  3. 编写里Linux命令解释器,linux基础教程试卷及答案
  4. 十天精通CSS3(11)
  5. docker安装Zabbix
  6. [BUUCTF-pwn]——xdctf2015_pwn200
  7. 字符输出流_Writer类FileWriter类介绍
  8. Servlet之间的跳转
  9. [react] 怎样动态导入组件?
  10. 1_Excel实战_自动录入另一个表格对应的数据
  11. 程序员:进不了大厂,就“永无出头之日”了?
  12. HDU 5353 Average 贪心
  13. 基于Java的高校社团管理系统
  14. JavaScript中this的指向 详解
  15. 无损音频flac转mp3
  16. 获两个千亿IPO投资人王刚:要逼自己在质上进取,不是在量上贪婪
  17. “peter piper picked a peck of pickled peppers“统计这段绕口令有多少个以p开头的单词 String中方法:split/startWith
  18. 管理者如何正确激励员工、调动其工作积极性?
  19. android平板投屏,Mac、ipad投屏安卓平板
  20. 用AI给黑白照片上色,复现记忆中的旧时光

热门文章

  1. python安装robotframework报错_robotframework-autoitlibrary离线安装
  2. python多目标跟踪卡尔曼滤波_卡尔曼多目标跟踪的例子?
  3. datagrid如何获取一行数据中的某个字段值_或许是全网最全面关于数据库面试题...
  4. python画旋转圆_Python使用PyQt界面库绘制不停旋转的圆控件
  5. 【script】python3使用http.server搭建简易web服务
  6. 添加url白名单_赏金技巧 | URL跳转Bypass案例
  7. 2019计算机网络考试,2019年计算机网络技术操作系统试题及答案.doc
  8. java字符串反转及替换_字符串的替换(str_replace)
  9. java如何实现动态时钟_java中的动态时钟
  10. pythonsplit函数_Python split()函数如何工作