单个神经元前向计算实现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()为例可以用下图来解释
转自https://www.cnblogs.com/likethanlove/p/6547405.html 校草的舍友的博客
图中可以看到这是对一个两行三列的矩阵进行加和运算,reduction_indices=1时函数进行跨列的压缩,而当其值等于0时做的是跨行的运算。
3 初学tensorflow(1.x)的时候要记住,其中的大部分操作都要经过一个会话的形式来运作,不要忘记创建会话!
4 动手操作比只看视频效果好,哪怕是照着敲一遍代码,效果也不一样。
运行结果
训练过程:
准确率:
笔记和代码基于中国大学mooc课程《深度学习应用开发-TensorFlow实践》
课程教师:浙江大学城市学院 吴明晖、李卓蓉、金苍宏