卷积神经网络概述
一般一个卷积神经网络由多个卷积层构成,在卷基层内部通常会有如下几个操作:
1)图像通过多个卷积核滤波,添加偏置,提取局部特征每个卷积核会映射出一个新的2D图像。
2)卷积核的滤波结果输出到激活函数中,激活函数通常选ReLU【书,参考37】
3)对激活函数的结果进行池化操作,池化就是对图像分割成不同的小区域后取平均值或最大值。一般取最大值。
上述几个步骤就构成了最常见的卷积层。在池化的后面还可以加上batch normalization等操作。
一个卷积层中可以有不同的卷积核,而每一个卷积核都对应一个滤波后映射出的新图像,同一个新图像的每一个像素都来自完全相同的卷积核。这种卷积核的权值共享可以有效降低模型负责度,减轻过拟合,减少计算量。
tensorflow实现
卷积神经网络结构
建立卷积神经网络对手写数字识别问题进行优化,构建由两个卷积层(包含池化层),两个全连接层构成的卷积神经网络。输入图像是28×28的单通道数据,输出是10×1的one_hot编码的向量。
第一层:卷积核大小是[5,5],输入通道1,输出通道32,padding选择SAME模式,激活函数为relu。
第二层:池化层,池化核大小是[2,2],步长[2,2]。
第三层:卷积核大小是[5,5],输入通道32,输出通道64,padding选择SAME模式,激活函数为relu。
第四层:池化层,设置同上。
第五层:全连接层,首先将图像数据矩阵flatten化,变成1维向量,输出维度是1024, 之后dropout掉一定的数据防止过拟合
第六层:全连接层,输出维度10,激活函数为softmax
损失函数:交叉熵
具体实现如下:
导入包和数据
首先导入需要的包和数据
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_DATA/', one_hot=True)
定义卷积核
卷积核是指定维数的张量,卷积核的大小为:[filter_height, filter_width, in_channels, out_channels]
这里用tf.Variable()定义卷积核,定义的时候会指定初始化的操作。
def weight_variable(shape):
initial = tf.truncated_normal(shape,stddev=0.1)
weight= tf.Variable(initial_value=initial)
return weight
定义偏置
def bias_variable(shape):
initial = tf.constant(0.1,shape=shape)
bias = tf.Variable(initial_value=initial)
return bias
对输入做卷积操作
def conv_op(in_tensor, kernel, strides=[1,1,1,1], paddi