• 第十二节 简单神经网络实现手写数字识别


    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data  # TensorFlow中提供的演示数据
    
    """
    神经网络的一些重要概念:
        全连接层:第N层和第N-1层之间的部分
        输出:有几个类别就有几个输出,每一个样本对每个类别都有一个概率值
        softmax:计算每个样本对所有类别的概率
        交叉熵:计算每个样本得出概率后,其损失值是多少
        反向传播:通过计算的损失值,不断的去调整权重,使得损失值达到最小
    """
    FLAGS = tf.app.flags.FLAGS
    tf.app.flags.DEFINE_integer("is_train", 1, "指定程序是预测还是训练")
    def full_connected():
    
        # 获取真实数据,会自动创建目录
        mnist = input_data.read_data_sets("./mnist/input_data/", one_hot=True)
    
        # 1.建立数据的占位符 特征值X [None, 784]  目标值y_true [None, 10]
        with tf.variable_scope("data"):
            # None代表不确定的样本数
            x = tf.placeholder(tf.float32, [None, 784])
            y_true = tf.placeholder(tf.float32, [None, 10])
    
        # 2.建立一个全连接层的神经网络 权重w [784, 10] 偏置b [10]
        with tf.variable_scope("fc_model"):
            # 随机初始化权重和偏置
            weight = tf.Variable(tf.random_normal([784, 10], mean=0.0, stddev=1.0, name="w"))
            bias = tf.Variable(tf.constant(0.0, shape=[10]))
    
            # 预测None个样本的输出结果,matmul矩阵相乘
            y_predict = tf.matmul(x, weight) + bias
    
        # 3.求所有样本的损失,然后求损失
        with tf.variable_scope("soft_cross"):
            # 求平均交叉熵损失
            loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
    
        # 4.梯度下降求损失
        with tf.variable_scope("optimizer"):
            # 0.1是学习率,minimize表示求最小损失
            train_op = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
    
        # 5.计算准确率,每一个样本对应每个特征值都有一个概率,tf.argmax(y_true, 1), tf.argmax(y_predict, 1)返回的是分别是真实值和预测值的正确的下标,equal判断两个下标是否一致,一样,则这个样本被标为1
        with tf.variable_scope("acc"):
            equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
    
            # equal_list None个样本 [1, 0, 1, 1, 0, 0.....]
            accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
    
        # 收集变量
        tf.summary.scalar("losses", loss)
        tf.summary.scalar("acc", accuracy)
    
        # 收集高纬度变量
        tf.summary.histogram("weights", weight)
        tf.summary.histogram("biases", bias)
    
        # 定义初始化变量op
        init_op = tf.global_variables_initializer()
    
        # 定义一个合并变量op
        merged = tf.summary.merge_all()
    
        # 创建一个saver保存训练好的模型
        saver = tf.train.Saver()
    
        # 开启会话进行训练
        with tf.Session() as sess:
            # 初始化变量
            sess.run(init_op)
    
            #建立events文件,然后写入
            filewriter = tf.summary.FileWriter("./tmp/summary/test/", graph=sess.graph)
    
            if FLAGS.is_train ==1:
                # 迭代步数训练,更新参数
                for i in range(2000):
                    # 取出真实存在的特征值和目标值,50表示50个样本作为一个批次
                    mnist_x, mnist_y = mnist.train.next_batch(50)
    
                    # 运行训练op
                    sess.run(train_op, feed_dict={x:mnist_x, y_true:mnist_y})
    
                    # 写入每步训练的值
                    summary = sess.run(merged, feed_dict={x:mnist_x, y_true:mnist_y})
                    filewriter.add_summary(summary, i)
    
                    # feed_dict这里的参数是必须,但是没有实际意义
                    print("训练第{}步,准确率:{}".format(i, sess.run(accuracy, feed_dict={x:mnist_x, y_true:mnist_y})))
                # 保存模型
                saver.save(sess, "./tmp/ckpt/fc_model")
            else:
                # 加载模型
                saver.restore(sess, "tmp/ckpt/fc_model")
                # 进行预测
                for i in range(100):
                    x_test, y_test = mnist.test.next_batch(50)
                    print("第{}张图片,首先数字目标是:{},预测结果是:{}".format(i, tf.argmax(y_test, 1).eval(), tf.argmax(sess.run(y_predict, feed_dict={x:x_test, y_true:y_test}), 1).eval()))
    
        return None
    if __name__ == "__main__":
        full_connected()
  • 相关阅读:
    MySQL集群在断网后再启动报"Unable to start missing node group"问题处理
    由于OCR文件损坏造成Oracle RAC不能启动的现象和处理方法
    使用dbms_scheduler包创建定时任务
    Oracle_12c_RAC_service_died问题分析处理
    MySQL使用正则表达式比较字段中的数字
    crontab不能正确执行的问题
    Oracle 12c SYSAUX表空间不足处理-清理audsys.cli_swp$a9b5f52c$1$1表
    HyperV上的Linux虚拟机启动报panic_early_exception错误
    Nagios NSclient Failed to get CPU value: 238(_total)6: Failed to get mutex :(
    两数相加II--链表
  • 原文地址:https://www.cnblogs.com/kogmaw/p/12599467.html
Copyright © 2020-2023  润新知