zoukankan      html  css  js  c++  java
  • Tensorflow框架初尝试————搭建卷积神经网络做MNIST问题

    Tensorflow是一个非常好用的deep learning框架

    学完了cs231n,大概就可以写一个CNN做一下MNIST了

    tensorflow具体原理可以参见它的官方文档

    然后CNN的原理可以直接学习cs231n的课程。

    另外这份代码本地跑得奇慢。。估计用gpu会快很多。

    import loaddata
    import tensorflow as tf
    
    #生成指定大小符合标准差为0.1的正态分布的矩阵
    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)
    
    #做W与x的卷积运算,跨度为1,zero-padding补全边界(使得最后结果大小一致)
    def conv2d(x, W):
        return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
    
    #做2x2的max池化运算,使结果缩小4倍(面积上)
    def max_pool_2x2(x):
        return tf.nn.max_pool(x, ksize = [1, 2, 2, 1],
                              strides=[1, 2, 2, 1], padding = 'SAME')
    
    #导入数据
    mnist = loaddata.read_data_sets('MNIST_data', one_hot=True)
    
    x = tf.placeholder("float", shape=[None, 784])
    y_ = tf.placeholder("float", shape=[None, 10])
    
    #filter取5x5的范围,因为mnist为单色,所以第三维是1,卷积层的深度为32
    W_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])
    
    #将输入图像变成28*28*1的形式,来进行卷积
    x_image = tf.reshape(x, [-1, 28, 28, 1])
    
    #卷积运算,activation为relu
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    
    #池化运算
    h_pool1 = max_pool_2x2(h_conv1)
    
    #第二个卷积层,深度为64,filter仍然取5x5
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    
    #做同样的运算
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    
    #full-connected层,将7*7*64个神经元fc到1024个神经元上去
    W_fc1 = weight_variable([7*7*64, 1024])
    b_fc1 = bias_variable([1024])
    
    #将h_pool2(池化后的结果)打平后,进行fc运算
    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)
    
    #防止过拟合,fc层进行dropout处理,参数为0.5
    keep_prob = tf.placeholder("float")
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    
    #第二个fc层,将1024个神经元fc到10个最终结果上去(分别对应0~9)
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    
    #最后结果
    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
    
    #误差函数使用交叉熵
    cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
    
    #梯度下降使用adam算法
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
    
    #正确率处理
    correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    
    #初始化
    sess = tf.Session()
    sess.run(tf.initialize_all_variables())
    
    #进行训练
    for i in range(20000):
        batch = mnist.train.next_batch(50)
        if i%100 == 0:
            train_accuracy = sess.run(accuracy, feed_dict = {
                x:batch[0], y_:batch[1], keep_prob : 1.0})
            print("step %d, accuracy %g" % (i, train_accuracy))
        sess.run(train_step, feed_dict={x:batch[0], y_:batch[1], keep_prob:0.5})
    
    #输出最终结果
    print(sess.run(accuracy, feed_dict={
        x:mnist.test.images, y_:mnist.test.labels, keep_prob:1.0}))
  • 相关阅读:
    解释机器学习模型的一些方法(一)——数据可视化
    机器学习模型解释工具-Lime
    Hive SQL 语法学习与实践
    LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)
    LeetCode 148. 排序链表(Sort List)
    LeetCode 18. 四数之和(4Sum)
    LeetCode 12. 整数转罗马数字(Integer to Roman)
    LeetCode 31. 下一个排列(Next Permutation)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    论FPGA建模,与面向对象编程的相似性
  • 原文地址:https://www.cnblogs.com/Saurus/p/7487720.html
Copyright © 2011-2022 走看看