深度学习应用开发-TensorFlow实践 - mnist手写数字识别1

单个神经元前向计算实现mnist手写数字识别

代码

import tensorflow as tf
import  tensorflow.examples.tutorials.mnist.input_data as input_data


mnist = input_data.read_data_sets("data/",one_hot=True)

#next_batch()实现方法会对内部数据先进行洗牌操作!
batch_image_xs, batch_lables_ys = mnist.train.next_batch(batch_size=10)

#每张图片有28*28 = 784个像素点
#一次投喂多少行不知道,但是投喂多少列知道故把行参数设置为空
x = tf.placeholder(tf.float32,[None,784], name='X')

#0-9一共十个数字,因此独热编码需要占10列,同理,行数不定,
y = tf.placeholder(tf.float32,[None,10])

#在矩阵运算后要求得到的是none行乘以十列的矩阵形式,因此使用正态分布
#的随机数来生成W的初值
W = tf.Variable(tf.random_normal([784,10]),name='W')
#所有的都加上偏置项b,格式为十列的行向量即可。
b = tf.Variable(tf.zeros([10]),name='b')

#定义一波前向计算
#矩阵的乘法使用tf.matmul()函数
forward = tf.matmul(x, W) + b
#由于最终要把图片的结果分为十类,所以要在矩阵运算的结果上使用softmax函数
#转化为属于各个类别的概率值
pred = tf.nn.softmax(forward)
#逻辑回归中的损失函数如果定义为平方损失函数,做出函数的图像可以发现
#这个函数是一个非凸函数,有多个极小值,使用这样的损失函数进行梯度下降,会使
#损失停止在局部最小值出无法脱身

#设置训练参数
train_epochs = 50 #训练轮数
batch_size = 100 #mini_batch的大小
total_batch = int(mnist.train.num_examples/batch_size) #每次训练的批次
display_step = 1  #显示粒度
learning_rate = 0.01 #学习率

#定义损失函数
#在行方向上压缩
loss_fuction = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),
                                             reduction_indices=1))
#定义优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_fuction)
#定义准确率
correct_prediction = tf.equal(tf.argmax(pred,1), tf.argmax(y, 1))
#把布尔值转化为平均数
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

#定义会话
sess = tf.Session()
#定义一个初始化操作,为所有的变量tensor赋上初值
init = tf.global_variables_initializer()
#执行初始化操作
sess.run(init)

#开始训练!!
for epoch in range(train_epochs):
    #下面是每轮训练的过程
    for batch in range(total_batch):
        xs, ys = mnist.train.next_batch(batch_size)
        sess.run(optimizer, feed_dict={x:xs, y:ys})
#使用验证数据集,来计算这一轮训练后模型的损失,和准确率!        
    loss,acc = sess.run([loss_fuction,accuracy],feed_dict={x:mnist.validation.images, y:mnist.validation.labels})
#打印训练过程中的详细信息
    if(epoch + 1) % display_step == 0:
        print("Train epoch:",'%02d' % (epoch+1),"Loss=","{:.9f}".format(loss),
              "Accuracy=","{:.4f}".format(acc))

print("Train Finished!")

#验证模型的可靠性
accu_test = sess.run(accuracy,
                     feed_dict={x:mnist.test.images, y:mnist.test.labels})
print("Test Accuracy:",accu_test)


注意

1 用自己找的数据训练模型的时候可以用shuffle函数代替next_batch(),在每次分批次取样时先对数据进行洗牌操作,排除由于特定顺序而导致的假学习。

2定义损失函数时reduction_indices=1语句,以tf.reduce_sum()为例可以用下图来解释深度学习应用开发-TensorFlow实践 - mnist手写数字识别1_第1张图片
转自https://www.cnblogs.com/likethanlove/p/6547405.html 校草的舍友的博客

图中可以看到这是对一个两行三列的矩阵进行加和运算,reduction_indices=1时函数进行跨列的压缩,而当其值等于0时做的是跨行的运算。

3 初学tensorflow(1.x)的时候要记住,其中的大部分操作都要经过一个会话的形式来运作,不要忘记创建会话!

4 动手操作比只看视频效果好,哪怕是照着敲一遍代码,效果也不一样。

运行结果

训练过程:
深度学习应用开发-TensorFlow实践 - mnist手写数字识别1_第2张图片
准确率:
在这里插入图片描述

笔记和代码基于中国大学mooc课程《深度学习应用开发-TensorFlow实践》
课程教师:浙江大学城市学院 吴明晖、李卓蓉、金苍宏

你可能感兴趣的:(深度学习应用开发-TensorFlow实践 - mnist手写数字识别1)