TensFlow框架学习之MNIST机器学习入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensFlow框架学习之MNIST机器学习入门相关的知识,希望对你有一定的参考价值。

  1. 前言:初学TensorFlow和机器学习,MNIST算法的每条语句都不是很清楚,通过查阅资料,将每句代码的基本用法差不多理解了。希望能够帮助正在学习的你  
[python] view plain copy
 
  1. <span style="font-size:32px;">from tensorflow.examples.tutorials.mnist  import  input_data  
  2. mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)</span>  
#mnist.train:训练数据,mnist.test:测试数据,mnist.valication:开发数据
#每份MNIST数据包含手写数字图像(后记为xs)和对应标注(后记为ys)2部分
# 训练集和测试集均包含xs和ys
# 所以训练图像是mnist.train.images、训练标注是mnist.train.labels.训练图像是mnist.train.images训练标注是mnist.train.labels
[python] view plain copy
 
  1. <span style="font-size:32px;">print(mnist.train.images.shape,mnist.train.labels.shape)  
  2. print(mnist.test.images.shape,mnist.test.labels.shape)  
  3. print(mnist.validation.images.shape,mnist.validation.labels.shape )</span>  
"""载入TensorFlow库,创建新的InteractionSession,使用命令将session注册为默认的session,之后的运算也默认跑在这个session不同session之间的数据和运算是相互独立的"""
[python] view plain copy
 
  1. <span style="font-size:32px;">import tensorflow as  tf  
  2. sess = tf.InteractiveSession()</span>  
"""x表示所有的手写体图片。它并不是一个固定值而是一个占位符,只有在TensorFlow运行时才会被设定真实
创建一个Placeholder,即输入数据的地方
第一个参数是数据类型,使用一个二维浮点
第二个参数[None,784]代表tensor的shape,代表数据的尺寸,None代表不限条数的输入,784代表每条输入是一个784维的向量"""
[python] view plain copy
 
  1. <span style="font-size:32px;">x = tf.placeholder(tf.float32,[None,784])</span>  
"""tf.Variable创建变量,使用 tf.zeros 将变量 W 和 b 设为初始化全为0的张量
w的形状是一个[784,10]的张量,第一个向量列表表示每个图片都有784个像素点,第二个向量列表表示从“0”到“9”一共有10类图片。所以w用一个784维度的向量表示像素值,用10维度的向量表示分类,
而2个向量进行乘法运算(或者说2个向量的笛卡尔集)就表示“某个像素在某个分类下的证据”。
b的形状是[10],他仅表示10个分类的偏移值。
"""
[python] view plain copy
 
  1. <span style="font-size:32px;">w = tf.Variable(tf.zeros([784,10]))  
  2. b = tf.Variable(tf.zeros([10]))</span>  
"""tf.nn包含了大量神经网络的组件,tf.matmul是TensorFlow中的矩阵乘法函数
tf.matmul(x, W) 表达式表示W和x的乘积运算,对应之前等式(y=softmax(Wx+b))的Wx,这个计算结果会得到一个y1=[None, 10]的张量,表示每个图片在10个分类下权重计算结果。
tf.matmul(x, W) + b 表示执行y2=y1+b的运算,它计算每个分类的偏移量。y2还是一个[None,10]的张量。最后使用 tf.nn.softmax 进行归一计算,得到每张图片在每个分类下概率。
TensorFlow能够将forward和backward的内容自动实现,只要接下来定义好loss,训练时会自动求导并进行梯度下降"""
[python] view plain copy
 
  1. <span style="font-size:32px;">y = tf.nn.softmax(tf.matmul(x,w) + b)</span>  
"""定义一个placeholder,输入的是真实的label,用来计算cross-entropy.
这里的y_ * tf.log(y)是对应交叉熵公式的乘积部分,tf.reduce_sum对应求和部分。
tf.reduce_mean则用来对每个batch数据结果求均值"""
[python] view plain copy
 
  1. <span style="font-size: 32px;">y_ = tf.placeholder(tf.float32,[None,10])cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices=[1]))</span>  
"""TensorFlow会根据我们定义的整个计算图自动求导,并根据反向传播进行训练,在每一轮迭代时更新参数来减小loss.
后台TensorFlow会自动添加许多运算操作来实现提到的反向传播和梯度下降。
我们只需要调用封装好的优化器,提供数据给它就好
调用tf.train.GradientDescentOptimizer,设置学习速率为0.5,优化目标设为cross-entropy,得到进行训练的操作train_step"""
[python] view plain copy
 
  1. <span style="font-size:32px;">train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)</span>  
"""使用TensorFlow的全局参数初始化器,执行它的run方法"""
[python] view plain copy
 
  1. tf.global_variables_initializer().run()  
"""抽取100条样本构成一个mini-batch,并提供给placeholder
接着调用train_step对样本进行训练"""
[python] view plain copy
 
  1. <span style="font-size:32px;">for i in range(1000):    </span>  
[python] view plain copy
 
  1. <span style="font-size:32px;">    batch_xs,batch_ys = mnist.train.next_batch(100)   </span>  
[python] view plain copy
 
  1. <span style="font-size:32px;">    train_step.run({x:batch_xs,y_:batch_ys})</span>  
"""tf.argmax是从一个tensor中寻找最大值的序号
tf.argmax(y,1)是求各个预测的数字中概率最大的那一个
tf.argmax(y_,1)是找样本的真是数字类别。
而tf.equal则用来判断数字类别是否就是正确的类别。
correct_prediction表示计算分类是否正确"""
[python] view plain copy
 
  1. <span style="font-size:32px;">correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))</span>  
"""统计全部样本预测的accuracy
先用tf.cast将之前corrext_prediction输出的bool值转换为float32,再求平均值"""
[python] view plain copy
 
  1. <span style="font-size:32px;">accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))</span>  
#将测试数据的特征和Label输入评测流程accuracy,计算模型在测试集上的准确率,打印结果
[python] view plain copy
 
  1. <span style="font-size:32px;">print(accuracy.eval({x:mnist.test.images,y_:mnist.test.labels}))</span>  
总结TensorFlow实现算法的流程:
(1)定义算法公式,也就是神经网络forward时的计算
(2)定义loss,选定优化器,指定优化loss
(3)迭代数据进行训练
(4)使用测试集进行验证

以上是关于TensFlow框架学习之MNIST机器学习入门的主要内容,如果未能解决你的问题,请参考以下文章

python入门python数据分析(numpymatplotlibsklearn等)tensflow爬虫机器学习深度学习自然语言处理数据挖掘机器学习项目实战python全栈PH

机器学习之深度学习入门

一次简单的报告:机器学习之支持向量机SVM

机器学习之画图

Rust机器学习之tch-rs

从零入门机器学习之Linux系统详解