1. 手写数字辨认功用完善

本文将继续进行手写数字辨认事例开发,首要针对于模型功用的完善进行事例演示,首要考虑从以下几个方面对上一篇文章介绍的事例进行完善。

  • 考虑添加准确率核算
  • 敞开Tensorboard显示变量
  • 模型保存与加载
  • 模型猜测并输出成果

准确率核算思路:

  • 模型经过softmax层输出成果为10个概率值
  • 找到最大概率值所在方位和实在值one-hot编码标签最大值所在方位
  • 若两者方位相同,则猜测正确
    • 两者所在方位相同回来1
    • 两个所在方位不共同回来0

准确率核算将用到如下函数:

  • np.argmax():回来最大值所在方位
  • tf.argmax(y_true, 1):能够检查最大实在值在列中所在方位(1表示按列求最大值方位)
  • tf.argmax(y_predict, 1):求最大的猜测值在列中所在方位
  • tf.equal():能够进行判断两者是否共同,若共同回来true,若不共同回来false(回来布尔数据类型)
  • tf.cast():数据类型转化,转化成想要的数据类型。由于tf.equal会回来布尔类型的长列表,咱们想让其回来浮点型长列表,以便核算准确率,需求对数据类型进行转化。

2. 事例演示

接下来,咱们将在上一篇文章建立的模型基础上进行完善,为其核算每一轮练习的准确率,并加以输出。

全连接神经网络模型张量改变过程:x[batch,784]∗w[784,10]+bias=ypredict[batch,10]x[batch,784]∗w[784,10]+bias=ypredict[batch,10]

  • 在优化丢失步骤以后参加准确率核算
  • 准确率核算先比较方位是否共同,回来布尔数据类型的列表
  • 然后,将其转化为浮点数类型,再进行平均值核算
  • 留意:还需求在会话中运转求平均值后的变量,才干使其有详细值
def full_connection():
    """
    用全连接神经网络辨认手写数字
    """
    # 1. 准备数据
    mnist = input_data.read_data_sets("./mnist_data", one_hot=True)
    x = tf.placeholder(dtype=tf.float32, shape=(None, 784)) # 784列:一张图片由784个像素组成,一次传入N张图片
    y_true = tf.placeholder(dtype=tf.float32, shape=(None, 10)) # 10列
    # 2. 构建模型
    weights = tf.Variable(initial_value=tf.random_normal(shape=(784, 10)))
    bias = tf.Variable(initial_value=tf.random_normal(shape=[10])) # 10个标量
    y_predict = tf.matmul(x, weights) + bias
    # 3. 构造丢失函数
    error = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict)) # 穿插熵丢失函数,再求平均值
    # 4. 优化丢失
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.02).minimize(error) # 梯度下降优化器,最小化丢失
    # 5. 准确率核算
    # 5.1 比较输出的成果最大值所在方位和实在值最大值所在方位
    # y_true的形状为(N, 10),有N个样本行,10列
    equal_list = tf.equal(tf.argmax(y_true, 1),
                         tf.argmax(y_predict, 1))
    # 5.2 求平均
    accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
    # 初始化变量
    init = tf.global_variables_initializer()
    # 敞开会话
    with tf.Session() as sess:
        sess.run(init)
        image, label = mnist.train.next_batch(100)
        print("练习之前的丢失loss为:%f" % sess.run(error, feed_dict={x:image, y_true:label}))
        # 开始练习
        for i in range(500):
            _, loss, accuracy_value = sess.run([optimizer,error, accuracy], feed_dict={x:image, y_true:label}) # optimizer是一个操作,不需求其回来值,用_(None)来接纳
            print("第%d次练习, 丢失为%f, 准确率为%f" % (i+1, loss, accuracy_value))
    return None
full_connection()      

运转成果如下图所示:经过500轮练习,终究准确率大约为0.65,能够进一步尝试增大练习轮数,观察其准确率是否还能够上升,并且能够考虑恰当调节学习率来进步准确率。

【深度学习】TensorFlow:全连接神经网络实现Mnist手写数字识别案例(2)

3. 总结

本事例运用一层全连接层完成了分类问题,留意是分类问题,咱们在最终一层的输出需求参加softmax激活函数,以此来解决多分类问题。本项目中运用的丢失函数为穿插熵丢失函数,运用梯度下降优化器来优化丢失。本文要点介绍的是准确率核算:通过比对实在值和猜测值的最大概率所在方位是否共同(若方位共同回来1;不共同回来0),再根据回来成果求平均值,以此来核算出准确率。

本文正在参加「金石计划 . 分割6万现金大奖」