卷积神经网络CNN

news2024/11/27 5:33:23

卷积神经网络CNN

  • CNN通常用于影像处理

为什么需要CNN

为什么需要CNN,我用普通的fully connected的反向传播网络进行图像训练会怎样

  • 需要过多参数

    假设一张彩色的图为100×100的,那么像素点就是100×100×3,那么输入层为三万维

    假设下一层隐含层有1000个神经元,那么这个神经网络第一层就已经有30000×1000个参数了

——CNN做的事情,就是简化这个神经网络的架构

——我们用一些人的理解,不要使用fully connected的神经网络,尽可能把不需要的参数从一开始就过滤掉

如何拿掉参数

为什么我们能够将一些参数拿掉?为什么我们可以简化这个网络架构?

减少冗余神经元

  • 我们神经元的训练,是为了观测图片上的某一个patterns

    比如某个神经元负责侦测有没有鸟嘴,有没有翅膀,有没有爪子等

    Some patterns are much smaller than the whole image

  • 因此,我们可以只观测部分,不需要观测整张图

    A neuron does not have to see the whole image to discover the pattern.

在这里插入图片描述

——侦测鸟嘴这部分的工作是一样的;我们不需要说,用一个神经元侦测一下左上方有没有鸟嘴,再用另一个神经元侦测中间部分有没有鸟嘴

——简化的基本就是,去除这种冗余的神经元,使得统一

Subsampling

  • 将像素点偶数列/偶数行删除
  • Subsampling the pixels will not change the object.

在这里插入图片描述

CNN步骤

在这里插入图片描述

  • Property 1

    某些patterns比整张图小的多,因此可以观测局部

  • Property 2

    某些同一种patterns出现在不同的地方

  • Property 3

    可以做Subsampling

Property1和Property2主要通过卷积操作完成

Property3主要通过Max Pooling完成

Convolution

——卷积

  • 存在一堆Filter(这些Filter相当于全连接网络的一个神经元)

  • 每一个Filter本质都是一个矩阵,矩阵里的每一个元素相当于网络的参数,和神经元的weight和bias一样,是需要train出来的

  • 每一个Filter,在侦测一个pattern

    例如,现在6×6的一个image,有一个Filter是3×3,这个Filter的作用相当于在侦测一个3×3的pattern

步骤

  • 将Filter放于图像上,与图像对应位置做内积
  • 实现property1,变成寻找对应pattern
image-20221104205242344
  • 挪动Filter的位置,这个挪动位置的多少,用stride表示

    这个stride是超参数,需要自己设定和调节

image-20221104205622853

这个Filter要检测的pattern,得到最大值分布在左上角和左下角,因此这个Filter对应检测的pattern分布在这个图上的左上角和左下角,就能够实现property2.

——同一个pattern,出现在不同位置,用同一个filter就能检测出来

  • 很多很多个Filter工作完成之后,形成Feature Map

缺陷

当你的pattern是不同大小的时候,会出现说你需要不同Filter才能够处理

例如当你的图像中,有大的鸟嘴和小的鸟嘴,需要不同size的Filter才能够解决甄别出鸟嘴

  • 方法一:如果你实现知道图像的pattern是偏大还是偏小,可以去先做normalized这件事
  • 方法二:DeepMind里提到一个新的方式,在CNN之前加多一层隐含层,该层需要提示了,需要将图片的哪一部分进行缩放,旋转等操作,再进入CNN中训练,可以得到比较好的结果

——对于彩图如何处理呢?因为有3个颜色通道(RGB),相当于是有一张图上有3个image,每一层分别代表RGB层的值

在这里插入图片描述

——这个时候,你的Filter就不是一个矩阵了,也是一个3维的立方体

在这里插入图片描述

注意

我们在做内积的时候,并不是把RGB每一层颜色,分开来算内积

而是把这三层和Filter一块来计算,从整体上来考虑这个pattern

在神经网络中理解Filter

卷积的过程,就是等同于一个网络删掉某些weight训练的结果

image-20221104213113842
  • 将image拉直

    内积对应相乘,等于某个值成对应权重,最后输出内积结果

    在这里插入图片描述

  • 只有对应框起来的那些神经元,才会进行连接

    通过这种方式,实现更少的参数

  • 同时,当我们通过stride进行挪动的时候,这个Filter不变,因此weight是不变的,只是连接的神经元变化了,达到了Share weights的功能
    image-20221107164048650

  • 这个时候就能实现更少的参数,因为用的是同一组weights

如何实现share weights

  • 原理和反向传播网络是一样的
  • 对于不连接的线,只要让它的weight一直是0,一直不训练它,就可以实现不完全连接的网络
  • 对于同一组weight,我们通过反向传播计算出多组梯度,然后取梯度平均,让他们update同样的量

Max Pooling

——SubSampling

  1. 对得到的矩阵,可以四个为一组,合并成一个值

    合并方式有很多:可以选其中最大值,可以取平均值

    达到让你的image变小的效果

    在这里插入图片描述

  2. 每一个Filter就能带来一层

    在这里插入图片描述

  3. 然后你就得到了比较小的image,然后再重复卷积-池化

Flatten

——扁平化

  1. 得到的Feature map拉直
  2. 丢进Fully connected的网络中进行训练就可以了
image-20221107174328543

CNN in keras

——你只需要修改网络的结构和输入的格式

——本来在DNN里面,input是一个向量vector

——CNN会考虑这个image的几何空间的,因此需要input一个张量tensor(高维的向量)

model.add(Conv2D(25,3,3,input_shape=(1,28,28)))
#Conv2D(25,3,3意味着有25个Filter,每个Filter是3*3的
#input_shape=(1,28,28)表明你输入的图片是28*28的,每个pixel是一个颜色,因此是1;如果是RGB的话需要3个颜色通道
image-20221107175030487
model.add(MaxPooling2D((2,2)))
#我们把feature map的东西,按照2*2来考虑,进行最大池化
image-20221107175210671

在这里插入图片描述

——扁平化

model.add(Flatten())

在这里插入图片描述

可解释性

  • 第一层的filter是比较容易解释的,我们只需要看它的值,就能够直到这个filter在detect什么特征
  • 但是第二层往后的filter,它直接针对的对象,并不是image的东西;而且它考虑的范围,并不是一个矩阵,而是一个高维的立方体

——如何识别这个filter是做什么的

  1. 第k个filter的输出拿出来

    image-20221107185823925
  2. 定义:Degree of the activation of the k-th filter

    定义一个东西,能衡量第k个filter有多activation
    a k = ∑ i = 1 11 ∑ j = 1 11 a i j k a^k=\sum_{i=1}^{11}\sum_{j=1}^{11}a_{ij}^k ak=i=111j=111aijk

  3. 我们希望直到这个filter做的是什么,我们找一张image,这个image能够使得 a k a^k ak最大

    假设我们input的image是x
    x ∗ = arg ⁡ max ⁡ x a k x^*=\arg\max_xa^k x=argxmaxak
    这个image——x能够让上述定义的Degree最大

    这个也可以通过梯度下降法来实现

  • 以往的过程是,我们通过image来update filter的参数,来使得可以训练出一个较好的神经网络模型
  • 当我们希望找到filter寻找的对应是什么feature时,我们可以反向——固定filter的参数,取update image,来找到这个image
image-20221107190410589

——然后结果大概是这样子

  • 我们可以看到,这些filter最match的image,都是一些纹路
  • 例如第一行第三个的filter,就是寻找一种斜条纹
  • 每个filter detect的就是不同角度的线条

——fully connected neural network的每个神经元做的是什么事情呢?

如法炮制刚才的做法

  1. 我们定义一个神经元的输出的是 a j a_j aj

  2. 然后我们需要找到一个image能够使得这个 a j a_j aj最大
    x ∗ = arg ⁡ max ⁡ x a j x^*=\arg\max_xa^j x=argxmaxaj

image-20221107191142540

——得到的结果大概是这样的

因为在做卷积这件事的过程,其实是在寻找一些feature,因此可以看到filter侦测的是类似于纹路的东西

因此我们可以看到,我们丢进去全连接的网络中,神经元输出的东西是不一样的

因为这个网络的工作是看整张图,是一个完整的图形,而不是一个局部的纹路

——虽然考虑的并不是是哪个数字,但是是某种线条中的图案

——考虑output

我们直接考虑output的输出,会不会得到数字呢?

然后反向寻找,使之最大的image
x ∗ = arg ⁡ max ⁡ x y i x^*=\arg\max_xy^i x=argxmaxyi

image-20221107191717899

——得到的结果是这样的

为什么是这样呢?

因为神经网络学习到的东西和人类学习的东西其实不太一样的。我们肉眼其实看不出上述的结果图有什么差别

我们将上面的图放进去CNN里面去训练,它就会反应说这个就是0,这个就是1,它就是能够区分

推荐文章——“Deep Neural Networks are Easily Folled”

https://ieeexplore.ieee.org/document/7298640

——怎样让它表现出来像数字

因为一张图是不是数字,我们都会有一些假设,会有一些东西肯定不是数字

我们应该对这个y做一些规范化regularization

对输入的x做一些constraint(约束)

这个约束告诉机器,这个x虽然能够让你的y很大,但是它不是数字
x ∗ = arg ⁡ max ⁡ x ( y i − ∑ i , j ∣ x i j ∣ ) x^*=\arg\max_x(y^i-\sum_{i,j}|x_{ij}|) x=argxmax(yii,jxij)
∑ i , j ∣ x i j ∣ \sum_{i,j}|x_{ij}| i,jxij所有pixel的values,这就是L1的正则项

得到的结果是这样的

image-20221107194211710

——这样之后,你得到的x就比较像数字了,你会发现6还是比较像的

让机器所看到的东西放大呈现出来,实际上是目前Deep Dream和Deep Style做的事情

Deep Style

  • 输入一张图片,让它的风格像某个著名的画作

在这里插入图片描述

在这里插入图片描述

参考文献——“A Neural Algorithm of Artistic Style”

[1508.06576] A Neural Algorithm of Artistic Style (arxiv.org)

——核心思路

  • 将第一张照片放进CNN里训练,得到Filter的output

  • 这个output得到的是第一张图有怎样的内容

  • 然后将呐喊放进CNN里训练,得到的是filter和filter之间的correlation(相关性)

  • 这个相关性代表的就是这张图里有怎样的风格

  • 使用同一个CNN,去找到一个image

  • 这个image通过filter后的输出能够像第一张照片的output;

  • 这个image输出的filter之间的correlation要像第二张照片

更多的应用

那么CNN呢,不只是用于图像上,也可以用于其他领域

Alpha Go

Alpha Go的监督学习的学习就是通过CNN实现的

那么什么时候可以使用CNN

  • 一些patterns比整张图小得多

  • 同一个patterns可能会出现在不同的位置

  • 做Subsampling不会影响图片的object——所以有maxpooling这个部分

    但是围棋里面并没有这个东西;那么Alpha Go是如何表现的呢?

Alpha Go的paper上有写到CNN的架构,它的输入是19×19×48的

因为这个棋盘是19×19的,48表示这个位置的一些状态,不仅仅是讨论上面是黑棋还是白棋,还有一些状态例如是否处于叫吃的状态等。

  1. 第一层将输入zero pads到23×23,(也就是用0填充外围)
  2. 用5×5的filter,一共是192个filters,stride=1
  3. 变成21×21的image
  4. 下面的filter都是3×3的filter,stride=1

然后你就会发现Alpha Go是没有使用max Pooling的

——根据围棋的特性,不需要再做max pooling这一层

Speech

在这里插入图片描述

  • 将speech的音频转换成Spectrogram
  • 这个CNN的filter,只在纵轴上移动

Text

在这里插入图片描述

  • 这个词序列需要先经过词嵌入,获得词对应的向量

  • 然后我们把向量排在一起,当作一个image

  • filter的高和向量的长度时一样的,沿着词汇的顺序进行移动,得到feature map

Learn more

让机器画出一些image

  1. PixelRNN

    [1601.06759] Pixel Recurrent Neural Networks (arxiv.org)

  2. Variation Autoencoder(VAE)

    [1312.6114] Auto-Encoding Variational Bayes (arxiv.org)

  3. Generative Adversarial Network(GAN)

    [1406.2661] Generative Adversarial Networks (arxiv.org)

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

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

相关文章

移动Web:Less 预处理及Koala工具

css 预处理器,后缀名为 .less。 less 代码无法被浏览器识别,实际开发需要转换成 css,使用 liink 标签引入 css 文件。 插件工具 Easy Less VS Code 内置插件(less 文件保存自动生成 css 文件) 更改编译后 css 存储路径…

华清远见11.7

系统移植开发阶段部署 1.准备文件,由于内核只支持安全的启动模式,要准备u-boot镜像文件u-boot-stm32mp157a-fsmp1a-trusted.stm32 TF-A镜像文件tf-a-stm32mp157a-fsmp1a-trusted.stm32 linux内核镜像文件uImage和stm32mp157a-fsmp1a.dtb 根文件系统r…

QT 中多线程实现方法总结

第一: 用QtConcurrentRun类,适合在另一个线程中运行一个函数。不用继承类,很方便 第二:用QRunnable和QThreadPool结合。继承QRunnable,重写run函数,然后用QThreadPool运行这个线程。缺点是不能使用信号和槽…

html5 -- canvas使用(1)

canvas 设置canvas标签 添加宽高 默认单位为px <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport&…

荧光标记氨基酸:荧光标记DL-天门冬氨酸,荧光标记甘氨酸-DL-天冬氨酸,DL aspartic acid labeled

产品名称&#xff1a;荧光标记甘氨酸-DL-天冬氨酸&#xff0c;DL aspartic acid labeled 甘氨酸-DL-天冬氨酸是一种化学物质&#xff0c;化学式是C6H10N2O5&#xff0c;分子量是208.17。 DL-天门冬氨酸(DL-Asp)在医药方面有着重要的用途,可用于合成DL-天门冬氨酸钾镁盐(脉安定…

云原生之K8s—yaml文件

目录 一、K8S支持的文件格式 1、yaml和json的主要区别 二、YAML 2.1、查看API资源版本标签 2.2、编写资源配置清单 编写nginx-test.yaml资源配置清单 创建资源对象 查看创建的pod资源 创建资源对象 网页访问一下 K8S中的port概述 创建yaml文件模板 查看生成yaml格式…

【python的静态方法,classmethod方法和__call___魔法方法】

classmethod魔法方法和staticmethodstaticmethod&#xff0c;静态方法classmethod&#xff0c;绑定类方法__call__&#xff0c;可调用类类方法staticmethod&#xff0c;静态方法 在python中&#xff0c;使用静态方法可以实现不需要实例化对象的绑定就可以直接调用的函数&#…

Linux系统编程·进程概念

你好&#xff0c;我是安然无虞。 文章目录自学网站上文回顾进程控制块—PCB查看进程初识系统调用初始fork函数练习题自学网站 推荐给老铁们两款学习网站&#xff1a; 面试利器&算法学习&#xff1a;牛客网 风趣幽默的学人工智能&#xff1a;人工智能学习 首个付费专栏&…

添加滚动彩色提醒通知公告代码

分享一个动态的滚动多样化的彩色提醒通知公告&#xff0c;代码是自适应的&#xff0c;放在很多地方都可以用&#xff0c;在wordpress、emlog等建站cms中&#xff0c;都可以在自定义侧边栏中&#xff0c;用来网站、博客的美化也是非常不错的选择。 使用说明: wordpress&#xff…

网络编程04-UDP的广播、组播

目录 一、UDP广播通信 1、什么是广播 2、特点 3、广播地址 4、实现广播的过程&#xff08;一定是使用UDP协议&#xff09; 广播发送端 广播接收方 练习1&#xff1a; 把广播通信进行实现 发送端 接收端 二、UDP组播&#xff08;群聊&#xff09; 1、概念 2、组播特…

(最新版2022版)剑指offer之动态规划题解

&#xff08;最新版2022版&#xff09;剑指offer之动态规划题解[剑指 Offer 42. 连续子数组的最大和][剑指 Offer 47. 礼物的最大价值][剑指 Offer 46. 把数字翻译成字符串][剑指 Offer 48. 最长不含重复字符的子字符][剑指 Offer 48. 矩形覆盖][剑指 Offer 买卖股票的最好时机…

小侃设计模式(五)-建造者模式与模板方法模式

1.概述 建造者模式&#xff08;Builder Pattern&#xff09;又叫生成器模式&#xff0c;是一种对象构建模式&#xff0c;它可以将复杂对象的建造过程抽象出来&#xff08;抽象类别&#xff09;&#xff0c;这个抽象过程的不同实现方法可以构造出不同表现&#xff08;属性&…

家庭主妇问题

一 问题描述 X 村的人们住在美丽的小屋里。若两个小屋通过双向道路连接&#xff0c;则可以说这两个小屋直接相连。X 村非常特别&#xff0c;可以从任意小屋到达任意其他小屋&#xff0c;每两个小屋之间的路线都是唯一的。温迪的孩子喜欢去找其他孩子玩&#xff0c;然后打电话给…

C++中TCP socket传输文件

在两个文件中都定义文件头和用到的宏&#xff1a; #define MAX_SIZE 10 #define ONE_PAGE 4096 struct FileHead {char str[260];int size; }; 在客户端发送接收阶段&#xff1a; //1.发送文件头char path[260] {0};cout<<"请输入文件路径"<<endl;cin…

数字图像处理MATLAB

数字图像处理MATLAB 基&#xff08;本&#xff09;操&#xff08;作&#xff09; 图片读取 Aimread(test.bmp); imshow(A);2. 图像写入 Aimread(test.bmp); imwrite(A,test-bak.bmp); Bimread(test-bak.bmp); imshow(B);3. 图像文件信息查询 infoimfinfo(test.bmp);4. 显示…

【创建型】生成器模式(Builder)

目录生成器模式(Builder)适用场景生成器模式实例代码&#xff08;Java&#xff09;生成器模式(Builder) 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 适用场景 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方…

【SpringBoot笔记22】SpringBoot框架集成Redis数据库

这篇文章&#xff0c;主要介绍SpringBoot框架如何集成Redis数据库。 目录 一、SpringBoot集成Redis 1.1、引入依赖 1.2、配置redis连接信息 1.3、添加RedisTemplate配置类 1.4、编写测试类 1.5、运行测试 一、SpringBoot集成Redis Redis是一个非关系型数据库&#xff0c…

PCIe ECAM机制访问PCIE的配置空间

1.PCIe ECAM机制 PCI Express Enhanced Configuration Access Mechanism (ECAM)是访问PCIe配置空间的一种机制。是将PCIe的配置空间映射到MEM空间&#xff0c;使用MEM访问其配置空间的一种实现。可参考NCB-PCI_Express_Base_5.0r1.0-2019-05-22.pdf的第7.2.2小节。 其地址映射…

上海亚商投顾:沪指录得6连阳 两市成交再度破万亿

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日横盘震荡&#xff0c;收盘集体小幅上扬&#xff0c;日K线均录得6连阳。虚拟现实概念股集体拉升&#…

【SA-Token】授权 鉴权中心微服务

授权 鉴权中心微服务 1 什么是JWT 1.2 JWT 的基本概念 1.3 JSON Web Token jwt 是一个开放标准 它定义了一种紧凑的、自包含的方式 用于作为JSON 对象在各方之间安全地传输信息 1.4.那些场景下可以考虑使用JWT &#xff1f; ​ 1.用户授权 信息交换 1.5 JWT的结构及其含义 …