在上一篇博文中MLP实现MNIST分类,由于MLP存在的缺点,我们引入CNN。
一、CNN(convolutional neutral network卷积神经网络)的应用
语音用户界面,自然语言处理,计算机视觉等等。
微软的WaveNet模型:将text转化成voice;学习用户的声音,并生成
分类情感:作者心情,影评等
图像分类
指导人工智能代理玩游戏:击球,看图说词,围棋
无人机
图像中文字识别:识别字母、数字、符号图片。
无人驾驶识别路标
google通过训练算法识别街景图片中的门牌号,构建更准确的全球街道地图
二、卷积层介绍
1、卷积层原理
检测一种性质需要一种过滤器filter,比如下图中的斜对角线过滤器,可以看出我们要找的就是这种特征。因此,我们经常需要可视化滤波器。
CNN学习时,不需要指定滤波器的规律和权重,都是从数据中学习。
2、stride和填充
图像m*n,过滤器a*a,stride。当stride > 1时,可能出现移动到最后,不为0的情况。
(m-a)/stride不为0时,如果只移动(m-a)/stride下取整次,则会丢失边缘信息。
如果移动(m-a)/stride上取整次,则需要填充。
填充值为0,或者与邻近一致。
垂直方向同理。
3、keras中的卷积层
from keras.layers import Conv2D
Conv2D(filters=16, kernel_size=2, strides=2, padding='same', activation='relu', input_shape=(200,200,1))
filters
- 过滤器数量k。kernel_size
- 指定(方形)卷积窗口的高和宽的数字。可以是数字,也可以是元组。比如F,或者(F,F)
strides
- 卷积 stride。如果不指定任何值,则s
设为1
。padding
- 选项包括'valid'
和'same'
。如果不指定任何值,则padding
设为'valid'
。不接受填充,也就是边缘有多余,也不进行处理了,可能损失边缘信息。activation
- 通常为'relu'
。如果未指定任何值,则不应用任何激活函数。强烈建议你向网络中的每个卷积层添加一个 ReLU 激活函数。- input_shape - 如果该层是第一层,一定要指定(X, Y, Z)
4、卷积层维度
from keras.models import Sequential
from keras.layers import Conv2D
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, strides=2, padding='valid', activation='relu', input_shape=(200,200,1)))
model.summary()
卷积层参数个数 = K*F*F*Z + K
卷积层深度 = K
卷积层空间维度:padding = 'same' XX = ceil(X/S), YY = ceil(Y/S)
padding = 'valid' XX = ceil((X-F+1)/S), YY = ceil((Y-F+1)/S)
该例子卷积层参数个数:16个滤波器*(每个滤波器2*2个权重*1) + 每个滤波器1个bias*16个滤波器 = 80
卷积层深度:滤波器个数16
卷积层的空间维度:ceil((200-2+1)/2)=100
三、池化层
参考文档:https://keras.io/layers/pooling/
1、池化层原理
当过滤层很多,造成卷积层参数很多的情况下,有可能出现过拟合的情况。因此,需要降维。池化层就是这个作用。池化层一般将卷积层当作输入。
池化层主要有2种类型。
(1)最大池化层
指定窗口大小和stride,取出窗口中最大的值做为新的输出。最终维数降低。
如下例子中,window_size = 2*2, stride = 2,输出变为输入的一半。
(2)全局平均池化层
既不指定窗口大小,也不指定stride,更极端的降维池化类型。一个特征映射最后就变成一个值,即全局平均值。
形象化描述:
如果说,卷积层后是一堆煎饼。则经过最大池化层,是一堆变小的煎饼;经过全局均值池化层,是一堆面包屑。
2、keras中的池化层实现---最大池化层
from keras.models import Sequential
from keras.layers import MaxPooling2D
model = Sequential()
model.add(MaxPooling2D(pool_size = 2, strides = 2, input_shape=(100, 100, 15)))
model.summary()
MaxPooling2D的参数:
pool_size
- 指定池化窗口高度和宽度的数字。
strides
- 垂直和水平 stride。如果不指定任何值,则strides
默认为pool_size
。padding
- 选项包括'valid'
和'same'
。如果不指定任何值,则padding
设为'valid'
。