zoukankan      html  css  js  c++  java
  • 第三节,CNN案例-mnist手写数字识别

    卷积:神经网络不再是对每个像素做处理,而是对一小块区域的处理,这种做法加强了图像信息的连续性,使得神经网络看到的是一个图像,而非一个点,同时也加深了神经网络对图像的理解,卷积神经网络有一个批量过滤器,通过重复的收集图像的信息,每次收集的信息都是小块像素区域的信息,将信息整理,先得到边缘信息,再用边缘信息总结从更高层的信息结构,得到部分轮廓信息,最后得到完整的图像信息特征,最后将特征输入全连接层进行分类,得到分类结果。

    卷积:

    经过卷积以后,变为高度更高,长和宽更小的图像,进行多次卷积,就会获得深层特征。

    1)256*256的输入(RGB为图像深度)

    2)不断的利用卷积提取特征,压缩长和宽,增大深度,也就是深层信息越多。

    3)分类

    池化:

    提高鲁棒性。

    搭建简单的卷积神经网络进行mnist手写数字识别

    网络模型:

    两个卷积层,两个全连接层
    输入[sample*28*28*1](灰度图)
    [ 28 * 28 *1 ]  --> (32个卷积核,每个大小5*5*1,sample方式卷积) --> [ 28 * 28 * 32] --> (池化 2*2 ,步长2)--> [14 *14 *32]
     
    [ 14 * 14 *32]  --> (64个卷积核,每个大小  5 * 5 * 32,sample方式卷积) -->  [14 * 14 *64] --> (池化 2*2 ,步长2)--> [7 * 7 *64]
     
    [ 7 * 7 * 64] --> reshape 成列向量 --> (7 * 7 * 64)
     
    [sample * (7*7*64)]  全连接层1 weights:[7*7*64 , 1024]  --> [sample * 1024]
     
    [sample * 1024]      全连接层2 weights:[1024,10]        -->  [sample *10]
    输出:10个分类

    1、定义变量weight_variable、bias_variable

    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)
    2、定义卷积层函数和池化层函数
    def conv2d(x, W):
        # stride [1, x_movement, y_movement, 1]
        # Must have strides[0] = strides[3] = 1
        return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
     
    def max_pool_2x2(x):
        # stride [1, x_movement, y_movement, 1]
        return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
    3、网络输入
    xs = tf.placeholder(tf.float32, [None, 784])/255.   # 28x28
    ys = tf.placeholder(tf.float32, [None, 10])
    keep_prob = tf.placeholder(tf.float32)
    #把xs的形状变成[-1,28,28,1],-1代表先不考虑输入的图片例子多少这个维度,后面的1是channel的数量
    #因为我们输入的图片是黑白的,因此channel是1,例如如果是RGB图像,那么channel就是3。
    x_image = tf.reshape(xs, [-1, 28, 28, 1])
    # print(x_image.shape)  # [n_samples, 28,28,1]
    4、建立两个卷积层和池化层:提高鲁棒性
    ## 本层我们的卷积核patch的大小是5x5,因为黑白图片channel是1所以输入是1,输出是32个featuremap ??? 32 是什么意思?####
    ###conv1 layer
    W_conv1 = weight_variable([5,5, 1,32])  # patch 5x5, in size 1, out size 32
    b_conv1 = bias_variable([32])
    #卷积运算
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) # output size 28x28x32
    h_pool1 = max_pool_2x2(h_conv1)                                         # output size 14x14x32
     
     ###conv2 layer
    W_conv2 = weight_variable([5,5, 32, 64]) # patch 5x5, in size 32, out size 64   ??? 64 是什么意思?
    b_conv2 = bias_variable([64])
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) # output size 14x14x64
    h_pool2 = max_pool_2x2(h_conv2)  
    5、建立全连接层
    W_fc1 = weight_variable([7*7*64, 1024])
    b_fc1 = bias_variable([1024])
    # [n_samples, 7, 7, 64] ->> [n_samples, 7*7*64]
    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)
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
     
    ## fc2 layer ##
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
    6、损失函数
    # the error between prediction and real data
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),reduction_indices=[1]))       # loss
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
     
    sess = tf.Session()
    init = tf.global_variables_initializer()
    sess.run(init)
    7、预测
    for i in range(500):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys, keep_prob: 0.5})
        if i % 50 == 0:
            print(compute_accuracy(mnist.test.images[:1000], mnist.test.labels[:1000]))
     

    #从测试集里面拿一些数据 试一试结果
    start = np.random.randint(1, 100)
    end = start + 10
    test_res=sess.run(prediction,feed_dict={xs : mnist.test.images[start:end],keep_prob: 0.5} )
    #print (res)
    #print (res.shape)  # shape : examples_to_show * 10
     
    # 输出图片识别的结果
    print ("number is : ", sess.run(tf.argmax(test_res,1)))
     
    # show 一下图片
    # 这段代码 是从别的地方copy 过来的,作用是将图片show出来
    f, a = plt.subplots(2, 10, figsize=(10, 2))
    for i in range(10):
        a[0][i].imshow(np.reshape(mnist.test.images[i+start], (28, 28)))
        #a[1][i].imshow(np.reshape(encode_decode[i], (28, 28)))
    plt.show()
    sess.close()
  • 相关阅读:
    Sqlserver 实际开发中表变量的用法
    Python Day 20 面向对象 (面向对象的组合用法,面向对象的三大特性
    Python Day 19 面向对象(初识面向对象)
    Python Day 18 常用模块(模块和包)
    Python Day 17 常用模块(常用模块一 时间模块,random模块,os模块,sys模块,序列化模块)
    Python Day 15 函数(递归函数、二分查找算法)
    Python Day 14 函数(内置函数,匿名函数(lambda表达式))
    Python Day 13 函数(迭代器,生成器,列表推导式,生成器表达式)
    Python Day 11 + Python Day 12 函数(函数名的应用,闭包,装饰器)
    Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)
  • 原文地址:https://www.cnblogs.com/wyx501/p/10442179.html
Copyright © 2011-2022 走看看