每一个神经元代表一个分类。
举例来说第一层的神经元做的事情简单来说就是判断有没有绿色,黄色,斜条纹出现
第二个layer做的是比他更复杂的东西,
然后再根据第二个layer的output,第三个layer会做更复杂的事情,
当我们用一般的fully-connected network做影像处理的时候,可能需要过多的参数
假设一张100*100的彩色图片把他拉成一列含100*100*3个pixel的数列,假设第一层有1000个神经元,就会产生30000*1000个参数。
CNN就可以简化这一架构,我们根据人的知识,根据对影像处理的理解,知道某些参数是用不到的
假如某一个神经元检测鸟嘴的存在 ,并不需要检测整张图,
所以每个神经元只需要连接到某一小块区域
同样的鸟嘴可能出现在图片的不同部位,但不需要分别做专门侦测上部鸟嘴和中部鸟嘴,只要将他们共用同一组参数,就可以减少参数的量。
我们可以对图片进行下采样,并不会影响人对这张图片的理解,就可以减少需要用的参数
整个CNN的架构
首先input一张图片 然后几次卷积和下采样 可以反复几次,然后flatten输入全连接层,最后得到影响便是的结果
基于三个经验组建cnn架构
1.一个图形不需要观测整张图片,只需要观测图片的一小部分 (通过卷积实现)
2.同一个图形会出现在图片的不同的区域(通过卷积实现)
3.我们可以通过subsampling而不会改变对象(通过马修pooling实现)
例如0代表没图墨水,1代表有墨水,每一个convolution有一组fliter,每一个filter其实就等同于fully—connected 里的一个·神经元
每一个fliter的参数必须是通过学习得到的
假如filter是3*3的那么他坚测得就是3*3的区域有没有这个pattern
先将filter放在左上角,对应值做内积,然后移动filter的位置 ,移动多少(stride)要事先确定好
然后,因为卷积层含有不同的filter,得到不同的matrix,所有matrix组合在一起叫做feature map
如果要处理彩色图片,那filter就不再是matrix而是一个立方体 image就是3*6*6,fliter就是3*3*3
convolution其实就相当于fully-connected 把一些 参数去掉
如果fully-connected需要36个weights,那convolution那就只需要9个 weights
当我们移动一格,经过convolution我们得到另外一个值-1,我们假设-1是另外一个nerual的输出
他们的weights是一样的,原本在fully-connected network中二者的weights是不同的,但是在convolution中shared weights,我们不仅把连接的weights减少,而且与之相连的weights共享的(某些nerual),训练过程中,用与backpropagation一样的做法,一些weight永远是0,若想将两个weight拥有相同的值,只需用一般的backpropagation,各算出一个gradion,然后平均,update
卷积后就是maxpooling
有多少filter深度就是多少 假设有25个filter得到25个feature map,在再一次卷积时获得的的featuremap不是25*25个还是25个 但每层filter的参数是3*3*25
拉直 放入全连接网络
DNN中input是一个vactor(向量),CNN的话会考虑他的几何空间
分析cnn学到了什么
第一个convolution可以根据可以根据output值及filter的值确定它在学什么
难点在后面的filter,第二层3*3的filter有50个,filter的input并不是pixels,而是卷积池化后的值,它的影响范围也不是3*3个pixels,
第k个filter的output为50*11*11
定义Degree of the activation of the k-th filter 为input的图像与第k个filter有多相近(ak)
想知道第k个filter的作用,可以寻找一张图片使得ak最大
可以用gradient ascent updata
原来在训练cnn时 ,input是固定的,model的参数是用gradient descent找到的,是找到一组参数让loss被minmax
现在刚好相反,现在model的参数是固定的,我们用gradient descent updata x
下图为12个filter的x*
input的与图越相近output的值越大
分析fully-connected layer中每一个nerual的工作
流程同上
x*如下所示,与上述filter不同,上述filter只考虑image的一部分,现在每一个nerual考虑的是整张图,但现在也并不是真曾一个完整的数字,而是一个比较大的特征
分析output
output为10维,每一维代表一个digit
我们要找一张image使得这个维度output最大
实际上image如下
将上述结果丢到cnn确实可以正确分类
+应为-,我们应告诉机器有些图像不是数字,对x做一些限制,即我们希望找到的image大部分是
相同颜色的,如下为结果,隐约可以看到数字
与deepdream的思想相近
将该照片丢到cnn中,将某一个layer的output拿出来,是一个vactor,把正值调大负值调小,将调整后得知当作一个目标,并找一张图片,使得output的值最大,也就是让cnn夸大化他看到的东西
deepstyple
先将原图丢到cnn得到filter的output,output代表这张图里有啥内容
然后将呐喊也丢到cnn中也得到filter的output,此时我们考虑的不再是这张图output的value,而是关注filter与fliter间output的关系代表了一张image的style
然后用同一个cnn找一张图,让它output的value像左边照片,同时image的style像右边的照片
在image有该有的特性如上述三点
我们可以对一个image做subsampling,不会影响看这张图的样子,
但是对围棋来说,max pooling怎么解释呢?
48为棋盘每一个位置都用48个value描述 ,也就是说不光看是否为黑子白子,而且还关注是否为叫吃的的状态等,并在周围补上0,变成23*23的image,第一个layer用的是5*5的filter,一共192个,
2-12层得到21*21的image,然后用3*3的filter,所以并没有用max pooling
上图为‘你好’的频率时间图,不同人说的‘你好’可能只是频率上的shift
input一个句子,首先将每个词都用一个向量表示(embedding dimension),排在一起变成一个image