zoukankan      html  css  js  c++  java
  • 深度学习原理与框架-Tensorflow卷积神经网络-神经网络mnist分类

    使用tensorflow构造神经网络用来进行mnist数据集的分类

    相比与上一节讲到的逻辑回归,神经网络比逻辑回归多了隐藏层,同时在每一个线性变化后添加了relu作为激活函数, 

    神经网络使用的损失值为softmax概率损失值,即为交叉熵损失值

    代码:使用的是mnist数据集作为分类的测试数据,数据的维度为50000*784 

    第一步:载入mnist数据集

    第二步:超参数的设置,输入图片的大小,分类的类别数,迭代的次数,每一个batch的大小

    第三步:使用tf.placeholder() 进行输入数据的设置,进行数据的占位

    第四步:使用tf.Variable() 设置里面设置tf.truncated_normal([inputSize, num_hidden], sttdv=0.1) 设置w的初始值,使用tf.Variable(tf.constant(0.1, [num_hidden])) 设置b,这一步主要是进行初始参数设置

    第五步:使用tf.nn.relu(tf.matmul()+b) 构造第一层的网络,tf.nn.relu(tf.matmul() + b) 构造第二层的网络, tf.matmul() + b 构造输出层的得分

    第六步:使用tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=score)) 来构造损失函数

    第七步:使用tf.train.GradientDescentOptimizer().minimize(loss) 使用下降梯度降低损失值

    第八步:使用tf.equal(tf.argmax(y, 1), tf.argmax(score, 1)) 即 tf.reduce_mean(tf.cast) 进行准确率的求解

    第九步:进行循环,使用mnist.train.next_batch(batchSize) 读取部分数据

    第十步:使用sess.run()执行梯度下降操作

    第十一步:循环一千次,执行准确率的操作,并打印准确率

    第十二步:使用验证集进行结果的验证

    import tensorflow as tf
    import matplotlib.pyplot as plt
    import numpy as np
    from tensorflow.examples.tutorials.mnist import input_data
    
    # 第一步数据读取
    mnist = input_data.read_data_sets('/data', one_hot=True)
    
    # 第二步:超参数的设置
    # 输入图片的大小
    inputSize = 784
    # 分类的类别数
    num_classes = 10
    # 隐藏层的个数
    num_hidden = 50
    # 迭代的次数
    trainIteration = 10000
    # 每一个batch值的大小
    batch_size = 100
    # 第二个隐藏层的个数
    num_hidden_2 = 100
    
    # 第三步:使用tf.placeholder()构造输入数据X 和 y
    X = tf.placeholder(tf.float32, shape=[None, inputSize])
    y = tf.placeholder(tf.float32, shape=[None, num_classes])
    
    #第四步:初始化W和b参数
    W1 = tf.Variable(tf.random_normal([inputSize, num_hidden], stddev=0.1), name='W1')
    b1 = tf.Variable(tf.zeros([num_hidden]), name='b1')
    # b1 = tf.Variable(tf.constant(0.1), [num_hidden])
    W2 = tf.Variable(tf.random_normal([num_hidden, num_hidden_2], stddev=0.1), name='W2')
    # b2 = tf.Variable(tf.constant(0.1), [num_classes])
    b2 = tf.Variable(tf.zeros([num_hidden_2]), name='b2')
    W3 = tf.Variable(tf.random_normal([num_hidden_2, num_classes], stddev=0.1), name='W3')
    b3 = tf.Variable(tf.zeros([num_classes]))
    
    # 第五步:使用点乘获得第一层,第二层和最后的得分值
    h1 = tf.nn.relu(tf.matmul(X, W1) + b1)
    h2 = tf.nn.relu(tf.matmul(h1, W2) + b2)
    y_pred = tf.matmul(h2, W3) + b3
    # 第六步:使用tf.nn.softmax_cross_entropy_with_logits计算交叉熵损失值
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_pred))
    # 第七步:使用tf.train.GradientDescentOptimizer降低损失值loss
    opt = tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss)
    # 第八步:使用tf.argmax(y_pred, 1)找出每一行的最大值索引,tf.equal判断索引是否相等
    correct_pred = tf.equal(tf.argmax(y_pred, 1), tf.argmax(y, 1))
    # tf.cast将索引转换为float类型,使用tf.reduce_mean求均值
    accr = tf.reduce_mean(tf.cast(correct_pred, 'float'))
    
    # 进行初始化
    sess = tf.Session()
    init = tf.global_variables_initializer()
    sess.run(init)
    
    for i in range(trainIteration):
        # 第九步:获得一个batch的数据
        batch = mnist.train.next_batch(batch_size)
        # 第十步:使用sess.run()对损失值降低操作和损失值进行执行,从而进行参数更新
        _, data_loss = sess.run([opt, loss], feed_dict={X: batch[0], y: batch[1]})
        # 第十一步:每迭代1000次就进行打印准确率和损失值
        if i % 1000 == 0:
            accurracy = sess.run(accr, feed_dict={X: batch[0], y: batch[1]})
            print('loss: %g accr: %g' % (data_loss, accurracy))
    # 第十二步:使用测试数据进行训练结果的验证
    batch = mnist.test.next_batch(batch_size)
    accurracy = sess.run(accr, feed_dict={X: batch[0], y: batch[1]})
    print('test accr %g'%(accurracy))

  • 相关阅读:
    slice和splice的区别
    Js中获取对象的所有key值
    设置layUI的时间laydate 结束时间大于开始时间
    vscode前端常用插件推荐,搭建JQuery、Vue等开发环境
    安装vue脚手架
    es6中...是什么意思
    html转义字符换行以及回车等的使用
    10款让人惊叹的HTML5/jQuery图片动画特效
    基于GIS技术的水利一张图平台
    BIM + 3D GIS在岩溶强发育区跨海盾构隧道施工中的实践应用
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/10527432.html
Copyright © 2011-2022 走看看