主要利用keras中的两个函数进行构建:
dilation_rate
value != 1."valid"
or "same"
(case-insensitive)."same"
is slightly inconsistent across backends withstrides
!= 1, as described"channels_last"
or "channels_first"
."channels_last"
corresponds to inputs with shape(batch, height, width, channels)
while "channels_first"
(batch, channels, height, width)
.image_data_format
value found in your~/.keras/keras.json
.dilation_rate
value != 1 isa(x) = x
).kernel
weights matrixkernel
weights matrixpool_size
."valid"
or "same"
(case-insensitive).channels_last
(default) or channels_first
.channels_last
corresponds to inputs with shape(batch, height, width, channels)
while channels_first
(batch, channels, height, width)
.最后训练的结果测试精度为: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
# 测试结果
test_loss,test_acc = model.evaluate(test_images,test_labels)
print(test_acc)
10000/10000 [==============================] - 1s 59us/step
0.9929
密集连接层和卷积层的根本区别
平移不变性(translation invariant)
模式的空间层次结构
特征图(feature map): 两个空间轴(高度和宽度)和一个深度轴(也叫通道轴)的 3D 张量。
**输出特征图(output feature map):**卷积运算从输入特征图中提取图块,并对所有这些图块应用相同的变换
整个提取的过程如下图:
以上的概念对应到MNIST示例,第一层卷积接收一个(28,28,1)的特征图,通过卷积运算,输出一个(26,26,32)的特征图。这里的32的意思是指的是32个滤波器(feature map)进行了计算,最后输出也是一个26x26的数值图像数据。也叫响应图(response map)。
响应图(response map): 经过了特征图的滤波后的结果。
如图:
所以这里的两个关键参数是:
将 3×3 或 5×5 的小窗口,在 3D 输入特征图上滑动(slide),每个可以滑动的位置进行张量运算,卷积运算,然后将计算的结果进行空间重组,转换为3D的输出特征图。
假设有一个 5×5 的特征图(共 25 个方块)。其中只有9个方块可以作为中心放入一个3×3 的窗口,这9个方块形成一个 3×3 的网格。也就是说通过过滤之后尺寸的大小会变化,而且是变小。为了不变少可以通过边界填充来实现。
**边界填充:**在输入特征图的每一边添加适当数目的行和列,使得每个输入方块都能作为卷积窗口的中心。
在keras的Conv2D
的函数中,可以通过参数padding
的设置。
两个连续窗口的距离是卷积的一个参数,叫作步幅,默认值为 1.
步幅为 2 意味着特征图的宽度和高度都被做了 2 倍下采样(除了边界效应引起的变化)。
最大池化的作用:对特征图进行下采样。
最大池化是从输入特征图中提取窗口,并输出每个通道的最大值。具体如下示意图:
池化层对于网络模型的作用:
分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!