(tensorflow)mnist数据集上的应用(一)

mnist数据集有55000个样本,测试集有10000个样本。每个样本为28*28=784个特征值。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
print(mnist.train.images.shape,mnist.train.labels.shape)
print(mnist.test.images.shape,mnist.test.labels.shape)

显示:

Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
(55000, 784) (55000, 10)
(10000, 784) (10000, 10)

载入tensorflow库,创建一个InteractiveSession,之后的运算也会在这个session中跑,不同的session之间的数据和运算都是相互独立的。

import tensorflow as tf
sess = tf.InteractiveSession()  #使用这个命令会将这个session为默认的session,运算会跑在这个session中

创建一个placeholder,输入数据,第一个参数为数据类型,第二个参数[None, 784]代表tensor的shape,即数据的尺寸,None表示不限制条数的输入,784代表着784维的向量。
接着需要给softmax模型的W与b创建Variable对象,用来储存模型参数。注意,不同于存储数据的tensor一旦使用掉就会消失,Variable在模型训练迭代中是持久化的(一直储存在显存中),在每轮跌赛中被更新。W与b全部初始化为0,模型训练会寻找合适的值。
softmax是tf.nn下的函数,tf.nn包含了大量神经网络的组件,matmul是tensoflow的矩阵乘法函数,矩阵a乘矩阵b。

x = tf.placeholder(tf.float32, [None, 784]) #输入数据的地方,是一个占位符
#创建Softmax模型的w与b
W = tf.Variable(tf.zeros([784, 10])) #variable用来储存模型,而且在模型迭代中是持久化的
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W)+b) #matmul是tensoflow的矩阵乘法函数,矩阵a乘矩阵b

训练模型需要定义loss函数描述模型的分类精度,对于多分类问题,通常使用cross-entropy作为loss函数。使用交叉熵的函数作为loss函数,假设现在有一个样本集中两个概率分布p,q,其中p为真实分布,q为非真实分布。假如,按照真实分布p来衡量识别一个样本所需要的编码长度的期望为:
H(X)=−∑xp(x)lnp(x)
但是,如果采用错误的分布q来表示来自真实分布p的平均编码长度,则应该是:
H(p,q)=−∑xp(x)lnq(x)
此时就将H(p,q)称之为交叉熵。
定义一个placeholder,输入真实的label,用以计算cross-entropy。tf.reduce_sum是求和, tf.reduce_mean是计算每个batch数据结果求均值。
训练采用随机梯度下降算法,并根据反响传播算法进行训练,在每一轮迭代时更新参数减小loss。GradientDescentOptimizer是封装后的优化器,只需每一轮给它feed数据就好。设置学习速率为0.5,优化目标设定为cross-entropy,得到训练的操作为train_step。

y_ = tf.placeholder(tf.float32, [None, 10]) #输入正确的y值
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y), reduction_indices=[1]))#交叉熵 计算真实值与预测值的误差,tf.reduce_sum是求和, tf.reduce_mean是计算每个batch数据结果求均值。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) #创建梯度下降算法优化模型

使用tensorflow全局参数初始化器tf.global_variables_initializer,直接执行run。
开始迭代进行训练操作train_step,每次随机从训练集中抽取100个样本构成一个mini-batch,并feed给placeholder,然后调用train_step对这些样本进行训练。使用一小部分样本好处是能跳出局部优化,避免使用全部样本计算量大,手链速度较快。

tf.global_variables_initializer().run() #初始化创建的变量
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
#sess.run (train_step, feed_dict={x: batch_xs, y_: batch_ys})
train_step.run({x: batch_xs, y_: batch_ys})
#随机抓取训练数据中的100个批处理数据点,然后我们用这些数据点作为参数替换之前的占位符来运行train_step。

训练完成,需要对模型的准确率进行验证。
tf. argmax是从一个tensor中寻找最大值的序号,tf.argmax(y, 1)是求各个预测值的数字中概率最大的一个,tf.argmax(y_, 1)是找样本的真实数字类别。tf.equal方法是用来判断预测的数字类别是否就是正确的类别,最后返回计算分类是否正确的概率。
计算accuracy需要先用tf.cast讲之前correct_prediction出书的bool转换为float32,tf.reduce_mean为求均值。
讲测试数据的特征和label输入评测流程accuracy,

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float32"))
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))

补充疑问:
tensorflow有两种方式:Session.run和 Tensor.eval,这两者的区别在哪?
答:
如果你有一个Tensor t,在使用t.eval()时,等价于:tf.get_default_session().run(t).
举例:

t = tf.constant(42.0)
sess = tf.Session()
with sess.as_default():   # or `with sess:` to close on exit
    assert sess is tf.get_default_session()
    assert t.eval() == sess.run(t)

这其中最主要的区别就在于你可以使用sess.run()在同一步获取多个tensor中的值,
例如:

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.mul(t, u)
ut = tf.mul(u, t)
with sess.as_default():
   tu.eval()  # runs one step
   ut.eval()  # runs one step
   sess.run([tu, ut])  # evaluates both tensors in a single step

注意到:每次使用 eval 和 run时,都会执行整个计算图,为了获取计算的结果,将它分配给tf.Variable,然后获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值