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,能够进一步尝试增大练习轮数,观察其准确率是否还能够上升,并且能够考虑恰当调节学习率来进步准确率。
3. 总结
本事例运用一层全连接层完成了分类问题,留意是分类问题,咱们在最终一层的输出需求参加softmax激活函数,以此来解决多分类问题。本项目中运用的丢失函数为穿插熵丢失函数,运用梯度下降优化器来优化丢失。本文要点介绍的是准确率核算:通过比对实在值和猜测值的最大概率所在方位是否共同(若方位共同回来1;不共同回来0),再根据回来成果求平均值,以此来核算出准确率。
本文正在参加「金石计划 . 分割6万现金大奖」