![7ed8a346998e1063ff2c1be878129bde.png](https://i-blog.csdnimg.cn/blog_migrate/a4c92508ccd7ce4368536af9db168980.jpeg)
卷积神经网络
Keras 中的卷积神经网络的搭建
主要利用keras中的两个函数进行构建: - Conv2D
最后训练的结果测试精度为:0.9938,测试精度为:0.9929
from keras import layers
from keras import models
model = models.Sequential()
# 卷积kernel 为(3,3),卷积核的个数是32个, 接收形状为 (image_height, image_width, image_channels)
model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)))
# pooling层,2x2取最大值,的输出都是一个形状为 (height, width, channels)
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation='relu'))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation='relu'))
#--------以上是卷积层的设置-------------------------------#
#将形状 (3, 3, 64) 的输出被展平为形状 (576,) 的向量
model.add(layers.Flatten())
# 创建密集层为分类做准备
model.add(layers.Dense(64,activation='relu'))
# 开始分类处理,利用softmax函数
model.add(layers.Dense(10,activation='softmax'))
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_5 (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 13, 13, 32) 0
_________________________________________________________________
conv2d_6 (Conv2D) (None, 11, 11, 64) 18496
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 5, 5, 64) 0
_________________________________________________________________
conv2d_7 (Conv2D) (None, 3, 3, 64) 36928
_________________________________________________________________
flatten_1 (Flatten) (None, 576) 0
_________________________________________________________________
dense_1 (Dense) (None, 64) 36928
_________________________________________________________________
dense_2 (Dense) (None, 10) 650
=================================================================
Total params: 93,322
Trainable params: 93,322
Non-trainable params: 0
_________________________________________________________________
# 准备数据训练模型
from keras.datasets import mnist
from keras.utils import to_categorical
(train_images,train_labels),(test_images,test_labels) = mnist.load_data()
train_images = train_images.reshape((60000,28,28,1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000,28,28,1))
test_images = test_images.astype('float32')/255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model.compile(optimizer='rmsprop',
loss = 'categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images,train_labels,epochs=5,batch_size=64)
Instructions for updating:
Use tf.cast instead.
Epoch 1/5
60000/60000 [==============================] - 10s 169us/step - loss: 0.1833 - acc: 0.9419
Epoch 2/5
60000/60000 [==============================] - 5s 84us/step - loss: 0.0477 - acc: 0.9851
Epoch 3/5
60000/60000 [==============================] - 5s 82us/step - loss: 0.0326 - acc: 0.9897
Epoch 4/5
60000/60000 [==============================] - 5s 83us/step - loss: 0.0247 - acc: 0.9925
Epoch 5/5
60000/60000 [==============================] - 5s 83us/step - loss: 0.0204 - acc: 0.9938
<keras.callbacks.History at 0x2b772bfdc88>
# 测试结果
test_loss,test_acc = model.evaluate(test_images,test_labels)
print(test_acc)
10000/10000 [==============================] - 1s 59us/step
0.9929
卷积运算
密集连接层和卷积层的根本区别 - Dense 层从输入特征空间中学到的是全局模式 - 卷积层学到的是局部模式
卷积神经网络性质
- 平移不变性(translation invariant)
- 卷积神经网络在图像右下角学到某个模式之后,它可以在任何地方识别这个模式,比如左上角
- 卷积神经网络在图像右下角学到某个模式之后,它可以在任何地方识别这个模式,比如左上角
- 视觉世界从根本上具有平移不变性
- 只需要更少的训练样本就可以学到具有泛化能力的数据表示
- 模式的空间层次结构
- 第一个卷积层将学习较小的局部模式
- 第二个卷积层将学习由第一层特征组成的更大的模式
- 卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念
特征图
特征图(feature map): 两个空间轴(高度和宽度)和一个深度轴(也叫通道轴)的 3D 张量。 - 深度一般是3,表示3个颜色通道,灰度图为1,表示灰度等级
输出特征图(output feature map):卷积运算从输入特征图中提取图块,并对所有这些图块应用相同的变换 - 输出特征图仍是一个 3D 张量 - 具有宽度和高度,其深度可以任意取值 - 输出深度是层的参数,是代表过滤器(filter)
整个提取的过程如下图:
![2ae3604bee619b1d2eb0f500c590fe7b.png](https://i-blog.csdnimg.cn/blog_migrate/ed05f5bb597a7fd77dd4d4206826de7b.jpeg)
以上的概念对应到MNIST示例,第一层卷积接收一个(28,28,1)的特征图,通过卷积运算,输出一个(26,26,32)的特征图。这里的32的意思是指的是32个滤波器(feature map)进行了计算,最后输出也是一个26x26的数值图像数据。也叫响应图(response map)。 响应图(response map): 经过了特征图的滤波后的结果。 如图:
![924b4a78885c0efbab3a66429cca11d3.png](https://i-blog.csdnimg.cn/blog_migrate/fa16414448b344c65501766369f9c33c.jpeg)
所以这里的两个关键参数是: - 从输入中提取的图块尺寸:3x3,5x5 - 输出特征图的深度:也就是滤波器的个数,比如上例中的32,64
卷积运算的过程
将 3×3 或 5×5 的小窗口,在 3D 输入特征图上滑动(slide),每个可以滑动的位置进行张量运算,卷积运算,然后将计算的结果进行空间重组,转换为3D的输出特征图。
![887c1c4be8372d68462493c590155cb9.png](https://i-blog.csdnimg.cn/blog_migrate/012a06516a6eab03b8b66bff62c91d6a.jpeg)
![6997589c065f3023d00255c9f5152a52.gif](https://i-blog.csdnimg.cn/blog_migrate/cd10fceea645584810272c86c36e632e.gif)
边界填充(padding)
假设有一个 5×5 的特征图(共 25 个方块)。其中只有9个方块可以作为中心放入一个3×3 的窗口,这9个方块形成一个 3×3 的网格。也就是说通过过滤之后尺寸的大小会变化,而且是变小。为了不变少可以通过边界填充来实现。
![fb7b876fe480cfe019c083c7c1d0d62f.png](https://i-blog.csdnimg.cn/blog_migrate/71618b05c9dac7c4a9934860aca0116d.jpeg)
边界填充:在输入特征图的每一边添加适当数目的行和列,使得每个输入方块都能作为卷积窗口的中心。
![03515ba5cf72a5d9d71b7c79b1986b6e.png](https://i-blog.csdnimg.cn/blog_migrate/a4ceb95e69fffb7244b057ef3d782c31.jpeg)
在keras的Conv2D
的函数中,可以通过参数padding
的设置。 - 'valid' 就表示不填充,默认是不填充 - 'same' 表示不填充
卷积步幅(strides)
两个连续窗口的距离是卷积的一个参数,叫作步幅,默认值为 1. 步幅为 2 意味着特征图的宽度和高度都被做了 2 倍下采样(除了边界效应引起的变化)。
池化运算
最大池化的作用:对特征图进行下采样。
最大池化是从输入特征图中提取窗口,并输出每个通道的最大值。具体如下示意图:
![7d33a7e31b66d0b2ef832fe67bb76de4.gif](https://i-blog.csdnimg.cn/blog_migrate/4cf3ca63fc19569f64d5a892b64bed1f.gif)
池化层对于网络模型的作用: - 利于学习特征的空间层级结构 - 减少参数量
分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!
![2c84157bdfab096e996c994e61fc1f1e.png](https://i-blog.csdnimg.cn/blog_migrate/129131ad0d7aa59e1f121ca365b532c0.jpeg)