IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 李宏毅机器学习p21-卷积神经网络 -> 正文阅读

[人工智能]李宏毅机器学习p21-卷积神经网络

李宏毅机器学习p21-卷积神经网络

为什么需要CNN?-CNN代替全连接神经网络的优势

直接用fully connect feedforward network来做影像处理的时候,会导致太多的参数。

比如说一张100 *100的彩色图(3通道),展成一个vector有100 *100 3的pixel,相当于input vector的维度大小是30000,如果一层hidden layer有1000个neuron,那么这个hidden layer的参数就是有30000 *1000。

CNN是用power-knowledge 简化fully connect layer(去掉一些参数),所以CNN比一般的DNN要简单,用更少的参数来做影像处理。

CNN 的 power-knowledge

CNN中用于简化fully connect layer的 power-knowledge主要有以下三种,凝炼来说其实就是参数公用和稀疏表示

  1. small region:大部分的pattern比整张image小。
  2. same patterns:相同的pattern可能出现在image不同的地方,但代表的是相同的含义。
  3. subsampling:下采样一张image,得到小的image可能不会影响对原始image的理解。

small region

根据前面那张做图像处理的第一层的 hidden layer提取的特征来看,第一层的neuron要做的事就是找到一些小的图像pattern。

检测一个image里面有没有某一个pattern出现,其实不需要看整张image,只要看image的一小部分

举例来说,假设我们现在有一张图片,第一个hidden layer的某一种neuron的工作就是要检测有没有鸟嘴的存在。它并不需要看整张图,只需要给neuron看着一小红色方框的区域(鸟嘴),它其实就可以判断是不是一个鸟嘴。

在这里插入图片描述

same patterns

样的pattern在image里面,可能会出现在image不同的部分,但是代表的是同样的含义,它们有同样的形状,可以用同样的neuron,同样的参数就可以把patter检测出来

比如,下面这张图里面有一张在左上角的鸟嘴,在这张图里面有一个在中央的鸟嘴,但是并不需要去训练两个不同的detector,一个专门去侦测左上角的鸟嘴,一个去侦测中央有没有鸟嘴。只需要让这两个neuron用同一组参数,就样就可以减少参数的量

subsampling

下采样一张image,得到小的image可能不会影响对原始image的理解。

可以让image变小,从而减小参数。

CNN架构

input一张image,这张image会通过convolution layer,然后经过max pooling,再做convolution,再做max pooling。这个过程可以反复无数次,重复次数就是network的架构(就像需要设计neuron有几层一样)。

做完几层convolution和Max Pooling以后,要把这些层最后的输出展平(flatten),再把flatten的output作为一般的fully connected feedforward network的输入,最后得到图像分类的结果。

CNN架构和前面power-knowledge的对应关系如下图所示:

Convolution层对应于small region和same pattern;

max pooling层对应于subsampling。

Convolution layer

Propetry1-用小的filter

如下图所示,1个filter相当于一个neuron,每一个filter是一个matrix(3 *3),这每个filter的weight(matrix里面每一个element值)就是network的parameter。filter的大小决定每次检测的局部范围。

Propetry2-每个filter的参数在image不同地方是一致的

filter滑动过图像,每次其weight和范围内的像素值做内积就是卷积过程。

比如:把这个filter放在image的左上角,把filter的9个值和image的9个值做内积,两边都是1,1,1(斜对角),内积的结果就得到3。(移动多少是事先决定的),移动的距离叫做stride(stride等于多少,自己来设计),内积等于-1。stride等于2,内积等于-3。我们先设stride等于1。

把filter往右移动一格得到-1,再往右移一格得到-3,再往右移动一格得到-1。

接下里往下移动一格,得到-3。以此类推(每次都移动一格),直到把filter移到右下角的时候,得到-1(得到的值如图所示)。

看filter的值,斜对角的值是1,1,1。所以它的工作就是检查image中有没有这个pattern(连续左上到右下的出现在这个image里面)。比如说:出现如图所示蓝色的直线,所以这个filter就会告诉你:左上跟左下出现最大的值。表明这个filter要检测的pattern,出现在这张image的左上角和左下角-propetry2。同一个pattern出现在了左上角的位置跟左下角的位置,就可以用filter 1侦测出来,并不需要不同的filter来检测不同位置同一pattern。

在一个convolution layer 里面会有很多的filter(刚才只是一个filter的结果),另外的filter会有不同的参数(图中显示的filter2),它也做跟filter1一模一样的事情,在filter放到左上角再内积得到结果-1,依次类推。

把filter2跟 input image做完convolution之后,就得到了另一个4*4的matrix,不同filter得到的matrixs合起来就叫做feature map,有几个filter,就得到多少个image

对于彩色的图像来说(多通道,多维tensor)。此时filter不是一个matrix,filter而是一个立方体。如果是RGB表示一个pixel的话,input就是3*6 *6,filter就是3 *3 *3。

那做convolution的时候就是将filter的9个值和image的9个值做内积(不是把每一个channel分开来算,而是合在一起来算,一个filter就考虑了不同颜色所代表的channel)

convolution和fully connected之间的关系

convolution就是fully connected layer把一些weight拿掉了(或者说一些地方的weight为0)。下图中同样的weight代表同样的颜色。

这两个neuron本来就在fully connect里面有自己的weight,当在做convolution时,首先把每一个neural连接的wight减少,并且强迫这两个neural共用一个weight(shared weight)

在这里插入图片描述

Max Pooling

根据filter 1得到4*4的maxtrix,根据filter2得到另一个4 *4的matrix,接下来在output每一组里面选择它们的平均或者选最大的值,这个操作可以让image缩小。

做完一个convolution和一次max pooling,就将原来6 * 6的image变成了一个2 *2的image。有*几个filter决定了这个2 2的pixel的深度(有50个filter就有50维),得到一个new image but smaller,一个filter就代表了一个channel。

Repreat-Convolution+Max pooling

整个过程可以重复很多次,通过一个convolution + max pooling就得到新的 image。它是一个比较小的image,可以把这个小的image,再次通过convolution + max pooling,将得到一个更小的image。

值得注意的是:假设第一层filter有2个,第二层的filter在考虑这个imput时是会考虑深度的,并不是每个channel分开考虑,而是一次考虑所有的channel。所以convolution有多少个filter,output就有多少个filter(convolution有25个filter,output就有25个filter,但注意这25个filter都是一个立方体),也就是说第一层有25个filter,得到25个feature map,第二层也是有25个filter(这个filter的channel为25),做完第二层以后并不会得到 2 5 2 25^2 252的feature map,而是输出25个feature map。

Flatten

flatten就是feature map拉直,拉直之后就可以作为fully connected feedforward netwwork的输入。

example

第一层25*3*3的filter,表示25个3*3的filter,每个filter有9个参数;输出25个matrix;

第二层的filter的channel为25(上一层feature map的dim),所以为50个3*3*25大小的filter,参数大小为225(3*3*25)。

通过两次convolution,两次Max Pooling,原来是1 *28 *28变为50 *5 *5。flatten的目的就是把50 *5 *5拉直,拉直之后就成了1250维的vector,然后把1250维的vector丢到fully connected。

如何可视化CNN的学习结果?

第一层的filter

分析input第一个filter是比较容易的,因为每一个filter就是一个3*3的matrix,对应到3 *3的范围内的9个pixel。所以只要看到这个filter的值就可以知道它在检测什么。

更高层的filter

但是对于更高层的filter来说,input并不是pixel(3 *3的9个input不是pixel)。而是做完convolution再做Max Pooling的结果。所以这个3 *3的filter就算把它的weight拿出来,也不知道它在做什么。而且这些filter看到的内容其实是比3 *3还要更大的。

现在做第二个convolution layer里面的50个filter,每一个filter的output就是一个matrix(11*11的matrix)。假设我们现在把第k个filter拿出来,它可能是这样子的(如图),每一个element我们就叫做 a i j k a_{ij}^k aijk?(上标是说这是第k个filter, i , j i,j i,j代表在这个matrix里面的第 i i i row和第 j j j column)。

定义一个东西叫做:“Degree of the activation of the k-th filter”,现在第k个filter有多被active(现在的input跟第k个filter有多match),第k个filter被启动的Degree定义成:这个11*11的 matrix里面全部的 element的summation

*想知道第k个filter的作用是什么,就是需要找一张image X,这张image它可以让第k个filter被active的程度最大。input一张image,然后看这个filter output的这个11 11的值全部加起来,当做是这个filter被active的程度。

现在是把X当做要找的参数用gradient ascent做update(minimize使用gradient descent,maximize使用gradient ascent)。

在train CNN network neural的时候,input是固定的,model的参数需要用gradient descent找出来,用gradient descent找参数可以让loss被 minimize。

但是现在是反过来的,在这个task里面,model的参数是固定的,要让gradient descent 去update这个X,让这个activation function的Degree of the activation是最大的。

如果我们随便取12个filter出来,每一个filter都去找一张image,这个image可以让那个filter的activation最大。现在有50个filter,你就要去找50张image,它可以让这些filter的activation最大。取了前12个filter,可以让它最active的image出来(如图)。

如果一个图上出现小小的斜的条纹,这个filter就会被active,这个output的值就会比较大。如果让图上所有的范围通通都出现这个小小的斜条纹的话,这个时候它的Degree activation会是最大的。(因为它的工作就是检测有没有斜的条纹,所以给它一个完整的数字的时候,它不会最兴奋。给它都是斜的条纹的时候,它是最兴奋的)

于是就会发现:每一个filter的工作就是检测某一张pattern。比如说:第三图detain斜的线条,第四图是detain短的直线条,等等。每一个filter所做的事情就是detain不同角度的线条,如果今天input有不同角度的线条,就会让某一个activation function,某一个filter的output值最大。

可视化Flatten的neuron

定义第j个neuron,它的output叫做 a j a_j aj?。找一张image(用gradient ascent的方法找一张X),这个image X丢到neural network里面去,它可以让 a j a_j aj?的值被maximize。找到的结果就是如图。

这些图跟刚才所观察到图不太一样,在刚在的filter观察到的是类似纹路的图案,在整张图上反复这样的纹路,那是因为每个filter考虑是图上一个小小的range(图上一部分range)。现在每一个neural,在做flatten以后,每个neuron的工作就是去看整张图,而不是是去看图的一小部分。

可视化output

(output就是10维,每一维对应一个digit)把某一维拿出来,找一张image让那个维度output最大。

期待的是能输出数字图片,但是实际得到的结果下图样子,每一张图分别代表数字0-9。也就是说:到output layer对应到0那个neuron(如图)。

img

这个neuron network它所学到东西跟人类是不太一样的可以查看这个相关的paper

让Output可视化更像数字

增加一些constraint,让Output可视化更像数字。

一张图是不是数字有一些基本的假设,比如说:这些就算不知道它是什么数字(显然它不是digit),人类手写出来的就不是这个样子。所以应该对x做constraint,通过告诉machine,有些x可能会使y很大但不是数字。根据人的power-knowledge就知道,这些x不可能是一些数字。

假设image里面的每一个pixel用 x i j x_{ij} xij?来表示,(每一个image有28 *28的pixel)我们把所有image上 i , j i,j i,j的值取绝对值后加起来(这一项就是L1-regularization)。

在找一个x可以让 y i y^i yi最大的同时让 ∣ x i j ∣ |x_{ij}| xij?的summation越小越好。也就是希望找出的image,大部分的地方是没有涂颜色的,只有非常少的部分是有涂颜色的。

加上constraint以后得到的结果如右图所示,跟左边的图比起来,隐约可以看出来它是一个数字(得到的结果看起来像数字)。

其他方法

Deep Dream

如果给machine一张image,它会在这张image里加上它看到的东西。

先找一张image,然后将这张image丢到CNN中,把它的某一个hidden layer拿出来(vector),它是一个vector(假设这里是:[3.9, -1.5, 2.3…])。接下来把postitive dimension值调大,把negative dimension值调小(正的变的更正,负的变得更负)。

把这个(调节之后的vector)当做是新的image的目标(把3.9的值变大,把-1.5的值变得更负,2.3的值变得更大。然后找一张image(modify image)用GD方法,让它在hidden layer output是设下的target)

这样做的话就是让CNN夸大化它所看到的东西,本来它已经看到某一个东西了,可以让它看起来更像它原来看到的东西。本来看起来是有一点像东西,它让某一个filter有被active,可以让它被active的更剧烈(夸大化看到的东西)。

在这里插入图片描述

Deep Style

风格迁移reference

在这里插入图片描述

今天input一张image,input一张image,让machine去修改这张图,让它有另外一张图的风格 (类似于风格迁移)

**风格迁移思路:**原来的image丢给CNN,然后得到CNN的filter的output,CNN的filter的output代表这张image有什么content。接下来把呐喊这张图也丢到CNN里面,也得到filter的output。我们并不在意一个filter ,而是在意filter和filter之间 的convolution,这个convolution代表了这张image的style。

接下来用同一个CNN找一张image,这张image它的content像左边这张相片,但同时这张image的style像右边这张相片。找一张image同时可以maximize左边的图,也可以maximize右边的图。那你得到的结果就是像最底下的这张图。用的就是刚才讲的gradient ascent的方法找一张image,然后maximize这两张图,得到就是底下的这张图。

什么时候可以用CNN-CNN的应用

要有相关的特性(前面提到的三个Power knowledge),以便可以使用CNN架构。

围棋

img

img

语音

注意不在Time的维度卷积。

文本

注意不在embedding的维度做卷积。

相关的paper

参考文献

P21 卷积神经网络

李宏毅机器学习视频

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:10:08  更:2021-09-26 10:11:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/16 23:39:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码