zoukankan      html  css  js  c++  java
  • TensorFlow——CNN卷积神经网络处理Mnist数据集

    CNN卷积神经网络处理Mnist数据集

    CNN模型结构:

    输入层:Mnist数据集(28*28)
    第一层卷积:感受视野5*5,步长为1,卷积核:32个
    第一层池化:池化视野2*2,步长为2
    第二层卷积:感受视野5*5,步长为1,卷积核:64个
    第二层池化:池化视野2*2,步长为2
    全连接层:设置1024个神经元
    输出层:0~9十个数字类别
     
    代码实现:
    import tensorflow as tf
    #Tensorflow提供了一个类来处理MNIST数据
    from tensorflow.examples.tutorials.mnist import input_data
    import time
     
    #载入数据集
    mnist=input_data.read_data_sets('MNIST_data',one_hot=True)
    #设置批次的大小
    batch_size=100
    #计算一共有多少个批次
    n_batch=mnist.train.num_examples//batch_size
     
    #定义初始化权值函数
    def weight_variable(shape):
        initial=tf.truncated_normal(shape,stddev=0.1)
        return tf.Variable(initial)
    #定义初始化偏置函数
    def bias_variable(shape):
        initial=tf.constant(0.1,shape=shape)
        return tf.Variable(initial)
    #卷积层
    def conv2d(input,filter):
        return tf.nn.conv2d(input,filter,strides=[1,1,1,1],padding='SAME')
    #池化层
    def max_pool_2x2(value):
        return tf.nn.max_pool(value,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
     
     
    #输入层
    #定义两个placeholder
    x=tf.placeholder(tf.float32,[None,784]) #28*28
    y=tf.placeholder(tf.float32,[None,10])
    #改变x的格式转为4维的向量[batch,in_hight,in_width,in_channels]
    x_image=tf.reshape(x,[-1,28,28,1])
     
     
    #卷积、激励、池化操作
    #初始化第一个卷积层的权值和偏置
    W_conv1=weight_variable([5,5,1,32]) #5*5的采样窗口,32个卷积核从1个平面抽取特征
    b_conv1=bias_variable([32]) #每一个卷积核一个偏置值
    #把x_image和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
    h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1)
    h_pool1=max_pool_2x2(h_conv1)  #进行max_pooling 池化层
     
    #初始化第二个卷积层的权值和偏置
    W_conv2=weight_variable([5,5,32,64]) #5*5的采样窗口,64个卷积核从32个平面抽取特征
    b_conv2=bias_variable([64])
    #把第一个池化层结果和权值向量进行卷积,再加上偏置值,然后应用于relu激活函数
    h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
    h_pool2=max_pool_2x2(h_conv2)  #池化层
     
    #28*28的图片第一次卷积后还是28*28,第一次池化后变为14*14
    #第二次卷积后为14*14,第二次池化后变为了7*7
    #经过上面操作后得到64张7*7的平面
     
     
    #全连接层
    #初始化第一个全连接层的权值
    W_fc1=weight_variable([7*7*64,1024])#经过池化层后有7*7*64个神经元,全连接层有1024个神经元
    b_fc1 = bias_variable([1024])#1024个节点
    #把池化层2的输出扁平化为1维
    h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64])
    #求第一个全连接层的输出
    h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
     
    #keep_prob用来表示神经元的输出概率
    keep_prob=tf.placeholder(tf.float32)
    h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)
     
    #初始化第二个全连接层
    W_fc2=weight_variable([1024,10])
    b_fc2=bias_variable([10])
     
    #输出层
    #计算输出
    prediction=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
     
    #交叉熵代价函数
    cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
    #使用AdamOptimizer进行优化
    train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
    #结果存放在一个布尔列表中(argmax函数返回一维张量中最大的值所在的位置)
    correct_prediction=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))
    #求准确率(tf.cast将布尔值转换为float型)
    accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
     
    #创建会话
    with tf.Session() as sess:
        start_time=time.clock()
        sess.run(tf.global_variables_initializer()) #初始化变量
        for epoch in range(21):  #迭代21次(训练21次)
            for batch in range(n_batch):
                batch_xs,batch_ys=mnist.train.next_batch(batch_size)
                sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7}) #进行迭代训练
            #测试数据计算出准确率
            acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})
            print('Iter'+str(epoch)+',Testing Accuracy='+str(acc))
        end_time=time.clock()
        print('Running time:%s Second'%(end_time-start_time)) #输出运行时间
     
    

      运行结果:

    TensorFlow主要函数说明
    1、卷积层
    tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)
    

      

    (1)data_format:表示输入的格式,有两种分别为:“NHWC”和“NCHW”,默认为“NHWC”
    (2)input:输入是一个4维格式的(图像)数据,数据的 shape 由 data_format 决定:当 data_format 为“NHWC”输入数据的shape表示为[batch, in_height, in_width, in_channels],分别表示训练时一个batch的图片数量、图片高度、 图片宽度、 图像通道数。当 data_format 为“NHWC”输入数据的shape表示为[batch, in_channels, in_height, in_width]
    (3)filter:卷积核是一个4维格式的数据:shape表示为:[height,width,in_channels, out_channels],分别表示卷积核的高、宽、深度(与输入的in_channels应相同)、输出 feature map的个数(即卷积核的个数)。
    (4)strides:表示步长:一个长度为4的一维列表,每个元素跟data_format互相对应,表示在data_format每一维上的移动步长。当输入的默认格式为:“NHWC”,则 strides = [batch , in_height , in_width, in_channels]。其中 batch 和 in_channels 要求一定为1,即只能在一个样本的一个通道上的特征图上进行移动,in_height , in_width表示卷积核在特征图的高度和宽度上移动的布长。
    (5)padding:表示填充方式:“SAME”表示采用填充的方式,简单地理解为以0填充边缘,当stride为1时,输入和输出的维度相同;“VALID”表示采用不填充的方式,多余地进行丢弃。
    对于卷积操作:
    2、池化层
    #池化层:
    #Max pooling:取“池化视野”矩阵中的最大值
    tf.nn.max_pool( value, ksize,strides,padding,data_format=’NHWC’,name=None)
    #Average pooling:取“池化视野”矩阵中的平均值
    tf.nn.avg_pool(value, ksize,strides,padding,data_format=’NHWC’,name=None)
    

      

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/asialee/p/9248495.html
Copyright © 2011-2022 走看看