您的位置:首页 > 其它

Tensorflow基础:卷积层和池化层

2017-10-12 15:35 190 查看
mnist最佳实践中,使用的是全连接网络结构。在Tensorflow中训练一个卷积神经网络的流程和训练一个全连接神经网络没有任何区别。卷积神经网络和全连接神经网络的唯一区别就在于神经网络中相邻两层的连接方式

全连接网络的问题

使用全连接神经网络处理图像的最大问题在于全连接层的参数太多。参数过多,除了导致计算速度减慢,还很容易导致过拟合问题。

卷积神经网络

卷积神经网络中前几层中每一个节点只和上一层中部分的节点相连,如下图所示:



有效地减少神经网络中参数个数。

卷积神经网络主要由一下5种结构组成:

输入层:在处理图像时,它一般代表了一张图片的像素矩阵

卷积层:卷积层中每一个节点的输入只是上一层神经网络的一小块(通常的大小有3*3或5*5)。卷积层试图将神经网络中的每一小块进行更加深入地分析从而得到抽象程度更高的特征

池化层:池化层(pooling)不会改变三维矩阵的深度,但是它可以缩小矩阵的大小,进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的

全连接层:在经过多轮卷积卷积层和池化层的处理之后,在卷积神经网络的最后一般会由1-2个全连接层来给出最后的分类结果。经过几轮卷积和池化层的处理之后,可以认为图像中的信息已经被抽象成了信息含量更高的特征。我们可以将卷积层和池化层看成自动图像特征提取的过程。在特征提取完成之后,仍然需要使用全连接层来完成分类任务。

Softmax层:主要用于分类问题。通过Softmax层,可以得到当前样例属于不用种类的概率分布情况。

卷积神经网络常用结构

卷积层

卷积层结构中最重要的部分—filter(过滤器,内核,卷积核)。过滤器可以将当前层神经网络上的一个子节点矩阵转化为下一层神经网络上的一个单位节点矩阵。

过滤器尺寸:过滤器输入节点矩阵的大小

过滤器深度:过滤器输出节点矩阵的深度



卷积层结构的前向过程

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



卷积层参数共享机制

在卷积神经网络中,每一个卷积层中使用的过滤器中的参数都是一样的。从直观上理解,共享过滤器的参数可以使得图像上的内容不受位置的影响。同时,共享每一个卷积层中过滤器的参数可以巨幅减少神经网络上的参数。

Tensorflow实现卷积层

Tensorflow对卷积神经网络提供了非常好的支持。下面的程序实现了一个卷积层的前向传播过程:

import  tensorflow as tf

# 通过tf.get_variable的方式创建过滤器的权重变量和偏置项变量,这里声明的参数变量是一个四维矩阵,前面两个维度代表了过滤器
# 的尺寸,第三个维度表示当前层的深度,第四个维度表示过滤器的深度

filter_weight = tf.get_variable('weights', [5, 5, 3, 16],
initializer=tf.truncated_normal_initializer(stddev=0.1))
biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))

# tf.nn.conv2d提供了一个非常方便的函数来实现卷积层前向传播的算法。
# 这个函数的第一个输入为当前层的节点矩阵,这个节点矩阵是一个四维矩阵,后面三维对于一个节点矩阵,第一维对应一个输入batch;
# tf.nn.conv2d的第二个参数提供了卷积层的权重;
# tf.nn.conv2d的第三个参数为不同维度上的步长stride。虽然第三个参数提供的是一个长度为4的数组,但是第一维和最后一维的数字要求一定是1
# 这是因为卷积层的步长只对矩阵的长和宽有效
# tf.nn.conv2d的第四个参数是填充(padding)的方法,Tensorflow中提供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)


池化层

在卷积层之间往往会加上一个池化层(pooling layer)。池化层可以非常有效地缩小矩阵的尺寸,从而减少最后全连接层中的参数。使用池化层既可以加快计算速度也有防止过拟合的作用。

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

使用最大值操作的池化层被称之为最大池化层(max pooling),被使用得最多的池化层结构。

使用平均值操作的池化层被称之为平均池化层(average pooling)

与卷积层的过滤器类似,池化层的过滤器也需要人工设定过滤器的尺寸、是否使用全0填充已经过滤器移动的步长等设置。两者在移动方式上唯一的区别在于卷积层使用的过滤器是横跨整个深度的,而池化层使用的过滤器只影响一个深度上的节点。所以池化层的过滤器除了在长和宽两个维度移动之外,还需要在深度这个维度移动。

Tensorflow实现池化层

# tf.nn.max_pool实现了最大池化层的前向传播过程,它的参数和tf.nn.conv2d函数类似。ksize提供了过滤器的尺寸,strides提供了步长信息,
# padding提供了是否使用全0填充
pool = tf.nn.max_pool(actived_conv, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: