跳到主要内容

在 TensorFlow 之中使用卷积神经网络

在之前的学习过程之中,我们已经使用过卷积神经网络,但是我们并没有真正的了解该网络的原理以及详细的使用规则。因此这节课我们便学习以下什么是卷积神经网络,并且了解如何在 TensorFlow 之中使用卷积神经网络。

1. 什么是卷积神经网络

卷积神经网络,Convolutional Neural Network,简称 CNN ,是一种在图像领域最常使用的一种神经网络

卷积神经网络总体来说可以分为三个部分:

  • 卷积层:用于提取数据的特征;
  • 池化层:对提取的特征的规模进行缩小,减少运算量;
  • 全连接层:FC 层,在 TensorFlow 之中就是 Dense 层。

卷积层最常用的作用就是用来 “提取特征”,也就是将二维数据的 “特征” 提取出来,而我们最常使用的二维数据就是图片数据

那么什么是特征?简单来说,特征就是数据中所包含的信息,我们对一个数据进行分类,利用的就是它的所包含的信息进行分类。而特征的形式多种多样,可以是二维向量,也可以是三维向量,当然也可以是一维向量。

2. 卷积层的原理

要进行专业的原理解释需要很多的数学推算,这里以平常最常见的二维卷积对图片进行处理为例进行说明。

说到卷积层,就不得不谈起卷积层的最重要的一个概念:卷积核

卷积核可以看作是一个算子,它会对图片数据的每个像素进行一次遍历,并且得到一个新的数据。

比如说,我们目前有一个图片数据,它的具体的数据为如下所示,其中每个数据表示一个像素点的数据。

1 2 1 2 0
0 2 3 4 5
4 2 0 1 3
1 1 2 3 4
5 0 0 1 2

假如我们的卷积核为:

1 0 1
0 1 0
1 0 1

那么卷积核会从左上角开始扫描,按照从左到右,从上到下的顺序进行扫描。

对于每一次扫描,得到的结果为:

结果 = 求和(卷积核每个位置的系数 * 扫描区域之中对应位置的数据)

比如对于第一次扫描,扫描区域为:

1 2 1 
0 2 3
4 2 0

那么我们得到结果为

1*1 + 2*0 + 1*1 +
0*0 + 2*1 + 3*0 +
4*1 + 2*0 + 0*1 = 8

用动画形式展示来说就是 (图片来源于链接):

图片描述

3. 池化层的原理

池化层的原理相对而言比较简单,它和卷积层一样,都包括一个算子,只不过该算子在扫描的过程之中不会经过之前扫描的部分,也就是说每个数据只会被扫描一遍

用动画形式展示来说就是 (图片来源于链接):

图片描述

不同的池化方法对应着不同的池化层,我们最常使用的是最大池化与平均池化:

  • 最大池化:取扫描区域的最大值;
  • 平均池化:取扫描区域的平均值。

3. 如何在 TensorFlow 之中使用卷积神经网络

1. 如何在 TensorFlow 之中使用卷积层

在 TensorFlow 之中,使用卷积层的具体 API 为:

tf.keras.layers.Conv2D(
filters, kernel_size, strides=(1, 1), padding='valid',
dilation_rate=(1, 1), activation=None, ......)

其中我们最常用的参数的具体含义包括:

  • filters:得到特征的通道数量,比如一般 RGB 的通道为 3 ,我们可以指定 filter 来输出指定通道数量的特征;
  • kernel_size:卷积核的大小,也就是算子的大小,可以为一个二维元组,也可以是一个整数(此时卷积核为正方形);
  • strides=(1, 1):卷积核移动的步伐,一般每次向右移动一格,每行向下移动一格,我们可以手动指定移动的步伐的大小。
  • padding=‘valid’:是否使用 Padding ,也就是说是否在原来数据的四周再加上一圈数据,这样可以让原图片的每个像素都在卷积核中央,可以选择为 valid 或者 same ;
  • dilation_rate=(1, 1):是否采用空洞卷积,很少使用,只有在扩大视野的时候使用,这里不再展开描述;
  • activation=None:激活函数,和我们之前接触的卷积函数一样。

2. 如何在 TensorFlow 之中使用池化层

在 TensorFlow 之中,使用池化层的具体 API 为:

tf.keras.layers.MaxPool2D(
pool_size=(2, 2), strides=None, padding='valid', ...
)

其中我们最常用的参数与卷积层类似,它们的具体含义包括:

  • pool_size: 池化算子的大小,和卷积层的 kernel_size 相似;
  • strides: 步伐大小,与卷积层的 strides 相同含义;
  • padding:是否进行填充,可以选择 valid 或者 same 。

3. 一个具体的卷积神经网络

由于我们在之前学习之中已经采用过卷积神经网络进行训练,因此同学们可以使用之前的数据进行训练,这里只是给出一个简单的网络模型,以及它的结构:

import tensorflow as tf

model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')])
model.summary()

我们可以得到数据为:

_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_5 (Conv2D) (None, 30, 30, 32) 896
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 15, 15, 32) 0
_________________________________________________________________
conv2d_6 (Conv2D) (None, 13, 13, 64) 18496
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 6, 6, 64) 0
_________________________________________________________________
conv2d_7 (Conv2D) (None, 4, 4, 128) 73856
_________________________________________________________________
flatten_4 (Flatten) (None, 2048) 0
_________________________________________________________________
dense_15 (Dense) (None, 128) 262272
_________________________________________________________________
dense_16 (Dense) (None, 64) 8256
_________________________________________________________________
dense_17 (Dense) (None, 10) 650
=================================================================
Total params: 364,426
Trainable params: 364,426
Non-trainable params: 0
_________________________________________________________________

在这个模型之中,我们默认输入的图像数据为 32*32 大小,并且拥有三个通道。在该模型之中,我们使用了三个二维卷积层与两个最大池化层,从而达到提取特征的目的。最后我们使用了三个全连接层来进行预测并进行输出。

4. 小结

这节课之中我们学习了什么是卷积神经网络,同时我们有具体的学习了什么是卷积层以及什么是池化层。于此同时我们对于其两着在 TensorFlow 之中的具体使用进行了详细的说明,最后我们实现了一个卷积神经网络,可以用于图像分类处理。

图片描述