TensorFlow实现卷积神经网络CNN

  

<强>一、卷积神经网络CNN简介

  

卷积神经网络(ConvolutionalNeuralNetwork, CNN)最初是为解决图像识别等问题设计的,CNN现在的应用已经不限于图像和视频,也可用于时间序列信号,比如音频信号和文本数据等.CNN作为一个深度学习架构被提出的最初诉求是降低对图像数据预处理的要求,避免复杂的特征工程。在卷积神经网络中,第一个卷积层会直接接受图像像素级的输入,每一层卷积(滤波器)都会提取数据中最有效的特征,这种方法可以提取到图像中最基础的特征,而后再进行组合和抽象形成更高阶的特征,因此CNN在理论上具有对图像缩放,平移和旋转的不变性。

  

卷积神经网络CNN的要点就是局部连接(LocalConnection),权值共享(WeightsSharing)和池化层(池)中的降采样(采样下来),其中,局部连接和权值共享降低了参数量,使训练复杂度大大下降并减轻了过拟合,同时权值共享还赋予了卷积网络对平移的容忍性,池化层降采样则进一步降低了输出参数量并赋予模型对轻度形变的容忍性,提高了模型的泛化能力。可以把卷积层卷积操作理解为用少量参数在图像的多个位置上提取相似特征的过程。

  

更多请参见:深度学习之卷积神经网络CNN

  

<强>二,TensorFlow代码实现

        #?usr/bin/env python2   # - * -编码:utf - 8 - *   ”“”   创建于2017年3月9日22:01:46星期四      @author: marsjhao   ”“”      进口tensorflow特遣部队   从tensorflow.examples.tutorials。mnist进口input_data      mnist=input_data。read_data_sets(“MNIST_data/?one_hot=True)   税=tf.InteractiveSession ()      def weight_variable(形状):   初始=特遣部队。truncated_normal(形状,stddev=0.1) #标准差为0.1的正态分布   返回tf.Variable(初始)      def bias_variable(形状):   初始=tf.constant(0.1,形状=形状)#偏差初始化为0.1   返回tf.Variable(初始)      def conv2d (x, W):   tf.nn返回。conv2d (x, W,进步=(1,1,1,1),填充=跋嗤?      def max_pool_2x2 (x):   tf.nn返回。max_pool (x, ksize=(1、2、2、1)   进步=(1、2、2、1)填充=跋嗤?      x=tf.placeholder (tf。float32,没有,784)   y_=tf.placeholder (tf。float32,[没有10])   # 1代表先不考虑输入的图片例子多少这个维度,1是频道的数量   x_image=特遣部队。重塑(x,[1] 1, 28日,28日)   keep_prob=tf.placeholder (tf.float32)      #构建卷积层1   W_conv1=weight_variable([5、5、1、32]) #卷积核5 * 5,1个频道,32个卷积核,形成32个featuremap   b_conv1=bias_variable([32]) # 32个featuremap的偏置   h_conv1=tf.nn。relu (conv2d (x_image W_conv1) + b_conv1) #用relu非线性处理   h_pool1=max_pool_2x2 (h_conv1) #池的池化      #构建卷积层2   W_conv2=weight_variable([5 5 64]) #注意这里通道值是32   b_conv2=bias_variable ([64])   h_conv2=tf.nn。relu (conv2d (h_pool1 W_conv2) + b_conv2)   h_pool2=max_pool_2x2 (h_conv2)      #构建全连接层1   W_fc1=weight_variable ([7 * 7 * 64 1024])   b_fc1=bias_variable ([1024])   h_pool3=特遣部队。重塑(h_pool2 [1, 7 * 7 * 64])   h_fc1=tf.nn.relu (tf。matmul (h_pool3 W_fc1) + b_fc1)   h_fc1_drop=tf.nn。辍学(h_fc1 keep_prob)      #构建全连接层2   W_fc2=weight_variable([10] 1024年)   b_fc2=bias_variable ([10])   y_conv=tf.nn.softmax (tf。matmul (h_fc1_drop W_fc2) + b_fc2)      cross_entropy=tf.reduce_mean (- tf。reduce_sum (y_ * tf.log (y_conv),   reduction_indices=[1]))   train_step=tf.train.AdamOptimizer(1)的军医.minimize (cross_entropy)   correct_prediction=tf.equal (tf。arg_max (y_conv, 1),特遣部队。arg_max (y_ (1))   精度=tf.reduce_mean (tf。铸造(correct_prediction tf.float32))      .run tf.global_variables_initializer () ()      因为我在范围(20001):   批=mnist.train.next_batch (50)   如果我% 100==0:   train_accuracy=准确性。eval (feed_dict={x:批处理[0],y_:批处理[1],   keep_prob: 1.0})   打印(“% d步,训练精度% g”%(我train_accuracy))   train_step.run (feed_dict={x:批处理[0],y_:批处理[1],keep_prob: 0.5})   print(“测试精度% g”%的准确性。eval (feed_dict={x: mnist.test.images,   y_: mnist.test。标签,keep_prob: 1.0}))      

<强>三、代码解读

  

该代码是用TensorFlow实现一个简单的卷积神经网络,在数据集MNIST上,预期可以实现99.2%左右的准确率。结构上使用两个卷积层和一个全连接层。

  

首先载入MNIST数据集,采用独热编码,并创建tf.InteractiveSession。然后为后续即将多次使用的部分代码创建函数,包括权重初始化weight_variable,偏置初始化bias_variable,卷积层conv2d,最大池化max_pool_2x2。其中权重初始化的时候要进行含有噪声的非对称初始化,打破完全对称。

TensorFlow实现卷积神经网络CNN