卷积神经网络---My way of AI 21
卷积神经网络
上一篇文章实现了用全连接层神经网络手写数字识别,但是全连接层神经网络有一个缺点就是:假设我是32323的RGB图片,如果我的第一层全连接层是500个节点,那么我需要的参数就是32323*500+500一共需要150多万个参数,这样会导致计算过慢以及过拟合的问题。
于是就有了卷积神经网络的算法。
卷积神经网络也有全连接层,但是在全连接层之前它加入了卷积层和池化层达到了减少计算参数的作用
卷积层
卷积层是卷积神经网络的重要组成部分,又被称为过滤器(Filter)。
过滤器所处理的节点矩阵的长和宽需要由人工指定,这个节点矩阵也被称为是过滤器的矩阵。RGB的节点矩阵是三维的,但是其过滤器尺寸是二维的。我们可以通过控制过滤器的深度来设置输出节点矩阵的深度。比如:如果我们希望RGB图片输出的深度也是三,我们过滤器的深度就需要是3。
这就是一个RGB图像进行过滤之后的操作,最后相应深度矩阵相乘的结果加上偏置就是对影1*1矩阵的值。
代码
import tensorflow as tf
# 初始化权重矩阵,尺寸5*5,当前层深度是3,过滤器深度是16就代表有16个filter
filter_weight = tf.get_variable("weight", [5, 5, 3, 16], initializer=tf.truncated_normal_initializer(stddev=0.1))
# 为16个过滤器设置偏置
biases = tf.get_variable("biases", [16], initializer=tf.constant(0.1))
# tf.nn.connv2d提供了非常方便的函数实现了卷积层的向前传播。,这个函数第一个矩阵代表当前层节点矩阵,这个矩阵是一个四维矩阵
# 后面三个维度对应节点矩阵,第一个维度对用哪一张图片,(batch批处理)
conv = tf.nn.conv2d(input, filter_weight, strides=[1, 1, 1, 1], padding="SAME") # SAME代表选择0填充
# 加上偏置
bias = tf.nn.bias_add(conv, biases)
# ReLU**函数去线性化
actived_conv = tf.nn.relu(bias)
卷积API
对照着demo看一下就能看懂了
池化层
首先明确一点池化层也是一种过滤器Filter。卷积层是加权求和加偏置,池化层更加简单就是在当前池化的size下选择最大值(max pooling)或者平均值(average pooling)
假如这是一张RGB图片,我们在三个维度的每一个维度都选择出最大值,其实也就代表着我们选择了分辨能力最大的像素点。很好理解。
代码
#池化层
pool=tf.nn.max_pool(actived_conv,
ksize=[1,3,3,1],strides=[1,2,2,1],padding="SAME")
参数解释:
actived_conv:卷积层计算好的参数
ksize:池化层窗口大小
strides:步长
ksize=[1,3,3,1],strides=[1,2,2,1],虽然给出的是一个长度为4的意味数组,但是这个数组第一个和最后一个元素必须是1,这表示池化层filter不可以跨不同输入样例或者节点矩阵深度。
全连接层
全连接层是卷积神经网络的最后一层,可以参考文章手写数字识别
author: [email protected] 欢迎交流