【TensorFlow 学习】卷积神经网络介绍及其常用结构分析

1. 卷积神经网络简介

1.1 全连接网络 vs 卷积网络

Alt text
相似点:

  • 结构相似:都是通过一层一层的节点组织起来的,每一个节点都是一个神经元;
  • 输入输出基本一致;
  • 训练流程基本一致。

不同点:

  • 全连接神经网络:
    • 每相邻两层之间的节点都有边相连;
  • 卷积神经网络:
    • 相邻两层之间只有部分节点相连;

全连接神经网络为什么不太适合图像识别任务?

  1. 参数数量太多
  2. 没有利用像素之间的位置信息
  3. 网络层数限制

卷积神经网络如何解决上面的问题?

  • 局部连接:每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
  • 权值共享:一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
  • 下采样:可以使用池化层(Pooling)来减少每层的样本数,进一步减少参数数量,同时还可以提升模型的鲁棒性。

1.2 卷积神经网络的基本网络结构

在这里插入图片描述
一个卷积神经网络网络主要由 5 种结构组成:

  1. 输入层:输入层是整个神经网络的输入。在处理图像的卷积神经网络中,它一般代表了一张图片的像素矩阵。从输入层开始,卷积神经网络通过不同的神经网络结构将上一层的三维矩阵转化为下一层的三维矩阵,直到最后的全连接层。
  2. 卷积层:卷积层中每一个节点的输入只是上一层神经网络的一小块,这个小块常用的大小有 3x3 或者 5x5。卷积层试图将神经网络中的每一小块进行更加深入地分析从而得到抽象程度更高的特征。
  3. 池化层:池化层不会改变三维矩阵的深度,但它可以缩小矩阵的大小。池化操作可以认为是将一张分辨率较高的图片转化为分辨率较低的图片。通过池化层,可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的。
  4. 全连接层:在经过多轮卷积层和池化层的处理之后,在卷积神经网络的最后一般会是由 1 到 2 个全连接层来给出最后的分类结果。经过几轮卷积层和池化层的处理之后,可以认为图像中的信息已经被抽象成了信息含量更高的特征。可以将卷积层和池化层看成自动图像特征提取的过程。在特征提取完成后,仍然需要使用全连接层来完成分类任务。
  5. Softmax 层:这一层主要用于分类问题。通过Softmax层,可以得到当前样例属于不同种类的概率分布情况。

2. 卷积神经网络常用结构

2.1 卷积层

2.1.1 卷积层的结构

  1. 卷积层最重要的部分被称之为过滤器(filter)或者内核(kernel)。
  2. 过滤器可以将当前层神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵。
  3. 过滤器处理的节点矩阵的长和宽由人工指定,这个节点矩阵的尺寸也叫过滤器的尺寸。常用的过滤器尺寸有 3 × 3 3 \times 3 3×3 5 × 5 5 \times 5 5×5

过滤器处理的矩阵深度和当前层神经网络节点矩阵的深度是一致的,所以虽然在图像识别中处理的节点矩阵是三维的,但是过滤器的尺寸只需要指定两个维度。

  1. 过滤器处理得到的单位矩阵的深度也需要人工指定。这个设置成为过滤器的深度。

注意:
过滤器的尺寸指的是过滤器输入节点矩阵的大小,深度指的是输出单位节点矩阵的深度。

2.1.2 卷积层的前向传播算法

过滤器的前向传播过程就是通过左侧小矩阵中的节点计算出右侧单位矩阵中节点的过程。

具体样例:通过过滤器将一个 2 × 2 × 3 2 \times 2 \times 3 2×2×3 的节点节点矩阵转变为一个 1 × 1 × 5 1\times 1\times 5 1×1×5 的单位节点矩阵。

过滤器的使用方法

一个过滤器的前向传播过程总共需要 2 × 2 × 3 × 5 + 5 = 65 2\times 2\times 3\times 5 +5=65 2×2×3×5+5=65 个参数,其中最后的 + 5 +5 +5 为偏置项参数的个数。
假设使用 w x , y , z i w^i_{x,y,z} wx,y,zi 来表示对于输出单位节点矩阵中的第 i i i 个节点,过滤器输入节点 ( x , y , z ) (x,y,z) (x,y,z) 的权重,使用 b i b^i bi 表示第 i i i 个输入节点对应的偏置项参数,name 单位矩阵中的第 i i i 个节点的取值 g ( i ) g(i) g(i) 为:
g ( i ) = f ( ∑ x = 1 2 ∑ y = 1 2 ∑ z = 1 2 a x , y , z × w x , y , z i + b i ) g(i)=f(\sum^2_{x=1}\sum^2_{y=1}\sum^2_{z=1}a_{x,y,z}\times w^i_{x,y,z}+b^i) g(i)=f(x=12y=12z=12ax,y,z×wx,y,zi+bi)
其中 a x , y , z a_{x,y,z} ax,y,z 为过滤器节点 ( x , y , z ) (x,y,z) (x,y,z) 的取值, f f f 为激活函数。
在这里插入图片描述

更直观的,给出如下动画。下图包含两个过滤器的卷积层的计算。可以看到 7 × 7 × 3 7\times 7\times 3 7×7×3 输入,经过两个 3 × 3 × 3 3\times 3\times 3 3×3×3 的过滤器进行卷积(步幅为 2),得到了 3 × 3 × 2 3\times 3\times 2 3×3×2 的输出。

卷积层结构的前向传播过程就是通过将一个过滤器从神经网络当前层的左上角移动到右下角,并且在移动中计算每一个对应的单位矩阵得到的。

权值共享原则

定义: 在卷积神经网络中,每一个卷积层中使用的过滤器中的参数都是一样的。
目的:

  • 共享过滤器的参数可以使得图像上的内容不受位置的影响。

以 MNIST 手写体数字识别为例,无论数字“1”出现在左上角还是右下角,图片的种类都是不变的。
因为在左上角和右下角使用的过滤器参数相同,因此通过卷积后无论数字在图像上的哪个位置,得到的结果都一样。

  • 共享每一个卷积层过滤器的参数可以巨幅减少神经网络上的参数。
TensorFlow 代码实现卷积层
# 通过 tf.get_variable 创建过滤器的权重变量和偏置项变量。
# 这里声明一个四维矩阵,前面两个维度代表过滤器的尺寸,第三个维度表示当前层的深度,第四个维度表示过滤器的深度。
filter_weight = tf.get_variable(
	'weights', [5, 5, 3, 16],
	initializer=tf.truncated_normal_initializer(stddev=0.1))
# 声明偏置项。16 为过滤器的深度,也是神经网络中下一层节点矩阵的深度。
biases = tf.get_variable(
	'biases', [16], initializer=tf.constant_initializer(0.1))

# tf.nn.conv2d 函数:卷积层前向传播算法。
# params:
# 	params1:当前层的节点矩阵。
# 	params2:卷积层的权重。
# 	params3:不同维度上的步长。
# 	params4:填充的方法。提供 SAME 或者 VALID 两种选择。 
# 			SAME 表示添加全 0 填充, VALID 表示不添加。
conv = tf.nn.conv2d(
	input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')

# tf.nn.bias_add 函数:给每一个节点加上偏置项。
bias = tf.nn.bias_add(conv, biases)

# 将计算结果通过 ReLU 激活函数完成去线性化
actived_conv = tf.nn.relu(bias)

2.2 池化层

池化层的主要作用是下采样,通过去掉特征图中不重要的样本,进一步减少参数数量。
优点:

  • 可以非常有效地缩小矩阵的尺寸,从而减少最后全连接层中的参数;
  • 加快计算速度;
  • 防止过拟合问题

2.2.1 池化层的前向传播

池化层的前向传播过程也是通过移动一个类似过滤器的结构完成的,但是池化层过滤器中的计算采用更加简单的运算:最大值或平均值运算。

  • 最大池化层(max pooling):使用最大值操作的池化层。(被使用得最多)
  • 平均池化层(average pooling):使用平均值操作的池化层。

下图展示了一个最大池化层前向传播计算过程。

TensorFlow 代码实现池化层
# tf.nn.max_pool 函数:最大池化层的前向传播函数。参数与 tf.nn.conv2d 类似。
# 第二个参数为过滤器的尺寸,池化层的过滤器不可以跨不同输入样例或节点矩阵深度。
# 实际应用中使用得最多的池化层过滤器尺寸是 [1,2,2,1]或者[1,3,3,1]
pool = tf.nn.max_pool(
	actived_conv, ksize=[1, 3, 3, 1],
	strides=[1, 2, 2, 1], padding='SAME')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值