文章目录
一、卷积神经网络(Convolutional Neural Network)
- 考虑到图像的性质,网络是否可以简化?可以,将DNN简化为CNN
- 有些图案(patterns)比整个图像要小得多
- 因此神经元不需要看到整个图像就能发现图案(patterns)
- 用较少的参数连接到小区域
- 相同的图案(patterns)出现在不同的区域(regions)
- 虽然下图中两只鸟嘴在图片的不同区域,但该网络是用来检测鸟嘴的,因此不需要额外再增加一个网络,他们可以共用相同的参数集
- 对像素进行下采样(Subsampling)不会改变对象
- 我们可以对像素进行下采样(Subsampling),使图像变小,从而使网络处理图像的参数更少
- 上述过程综合起来如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nIEac7w-1660888940226)(C:/Users/肖雄/AppData/Roaming/Typora/typora-user-images/image-20220818185919532.png)]
1.1 卷积(Convolution)
- 首先我们会设定很多组过滤器(Filter),每个过滤器就是一个矩阵(Matrix)
- 性质一:每个过滤器检测一个小图案(3×3)
- 性质二:每个过滤器都会与像素矩阵相乘,最后得到一个新的特征图(Feature Map)
- 上面是单色图的卷积操作,同样对于彩色图的卷积操作也是如此
- 卷积(Convolution)和全连接(Convolution)的关系
- 实际上,卷积的本质就是全连接拿掉了网络中的一些权重后得到的结果,同时共享了网络中的一部分权重
- 这样做的好处是极大减少了网络所需的参数,降低了运算量
1.2 最大值池化(Max Pooling)
- 将卷积后的结果分成4块,每块都只取一个最大值,这就是最大值池化的操作
- 原来6X6的图片在经过一次由2个3X3的过滤器的卷积和最大值池化的操作后得到2X2的图片,比原始图像要小
- 每个过滤器就是一个通道(channel)
1.3 平整化 (flatten)
- 如图将2X2的图像拉直成一维向量,然后输入到全连接前馈网络(Fully Connected Feedforward network)中,这就是平整化 (flatten)的过程
二、用Keras实现CNN
- 卷积操作
- 只修改了网络结构和输入格式,高维的向量也被称为张量(tensor)
- 如下图,第一层卷积层的过滤器只有3X3=9个参数,第二层卷积层的过滤器只有3X3X25=225个参数
- 池化操作
- model2. add (MaxPooling2D( (2,2))
- 平整化操作
- model2. add (Flatten())
2.1 CNN学到了什么?
- 卷积操作中的过滤器(filter)作用
- 如图第k个过滤器的输出是一个11×11的矩阵。第k个过滤器的激活程度(Degree of the activation)是 ak
- 此时我们为了搞清楚每个过滤器的作用,就对输入x做梯度上升(gradient ascent),找出让过滤器激活程度 ak 最高的 x
- 图二就是找到的一组x,很明显,每个过滤器的作用就是找出有一定规则的条纹状图
- 全连接网络中的神经元(neuron)作用
- 每个图形对应一个神经元
- 如图寻找图像 x*,使得神经元输出的 aj 最大化,从得到的图像可以看出神经元的作用是找出有一定规则的图案
- 考虑输出 yi
- 如图寻找图像 x*,使得全连接层输出的 yi 最大化,从得到的图像我们人类是无法区分图片所代表的具体数字的,但是机器却可以
- 为了让将机器挑选的图片看起来更像数字,我们应该对 y 做一些正则化(regularization),对 x 做一些约束(constraint)。如图将 x i j x_{ij} xij 取绝对值并求和,这就是 L1正则化, x i j x_{ij} xij 代表图中每一个像素(pixel)
- 做约束的这一过程,其实就是Deep Dream
2.2 Deep Dream
- Deep Dream就是给机器一张图片,机器会在这个图片里加上它看到的东西。
- 如图,实际操作就是向CNN网络输入一张图片,然后取出某层网络里的过滤器,或者是全连接层里面的某一个隐层拿出来,得到的就是一个向量,我们将这个向量里的正值调大,负值调小,也就是让正值更正,负值更负。然后找一张修改后的图片输入到网络中,让它的输出更接近我们刚刚修改后的向量,这么做其实就是让CNN夸大化它看到的东西。也就是让它现在看到的东西更像它原来看到的东西,实际上就是让原本被激活的过滤器,激活程度变得更高,更敏感。
2.3 Deep Style
- 给机器一张照片,让它去修改这张图,使其有另一种图片的风格,这就是Deep Style,也是Deep Dream的进阶版本
- 原理就是将原始图片输入到CNN中,然后得到过滤器的输出,输出代表这一张图像里面有什么样的内容;同样我们对另一张图片做同样的操作,但我们此时并不考虑过滤器的输出,而是考虑过滤器与过滤器之间输出的相关性(correlation),而这个相关性代表了一张图的风格。接下来我们用同一个CNN,来找一张图片,使这张图片的内容(过滤器的输出)要像原始图片,同时这张图片的风格(过滤器与过滤器之间输出的相关性)要像另一张图片
三、CNN的其他应用
3.1 Alpha Go
- 实际上传统的DNN是可以实现Alpha Go的,但我们为什么要用CNN呢?
- 首先用CNN会有更好的表现,其次它符合CNN的3个条件中的2个
- 有些图案(pattern)比整个图像小得多
- 相同的图案(pattern)出现在不同的地区
- 由于棋盘不满足CNN的第三个性质:对像素进行下采样(Subsampling)不会改变对象,因此Alpha Go的CNN架构是没有最大值池化(Max Pooling)这个操作的
- 首先用CNN会有更好的表现,其次它符合CNN的3个条件中的2个
3.2 语音(Speech)
- 下图是一段声音的谱图(spectrogram),其横轴代表时间,纵轴代表这一段时间的频率(frequency)。
- 图中红色部分代表在那一段时间里,那一个频率的能量比较大。实际上这是**”你好“**这段语音的谱图
- 因此我们可以将语音谱图输入到CNN,由于在语音上,我们只考虑在频率方向(上下方向)移动的过滤器,也就是说我们的过滤器是长方形的,宽度和图片的宽度一样,移动过滤器时只做上下移动。
- 这么做的原因是当不同人的发声内容相同时,实际上他们的图案(pattern)还是一样的,只是图片上的位置不同。
- 这告诉我们用CNN设计网络时,一定要考虑具体的应用场景。
3.3 文本 (Text)
- 文字嵌入(word embedding):将每个单词用一列向量来表示,这就组成了一个句子矩阵S(sentence matrix),就可以用CNN的方法来进行求解了。并且过滤器移动的方向是句子衔接的方向(左右方向),而不会在文字嵌入的维度(上下方向)去移动过滤器