这个文章是对google官方教程的解释

预备知识

\[\begin{equation*}
\left[
\begin{array}{cccc}
a_1 & a_2 & a_3
\end{array}
\right]
\end{equation*}
\]

\[\begin{equation*}
softmax(a)=
\left[
\begin{array}{cccc}
\frac{e^{a_1}}{e^{a_1}+e^{a_2}+e^{a_3}} & \frac{e^{a_2}}{e^{a_1}+e^{a_2}+e^{a_3}} & \frac{e^{a_3}}{e^{a_1}+e^{a_2}+e^{a_3}}
\end{array}
\right]
\end{equation*}
\]

tensorflow里面有softmax的函数.可以直接调用.

import tensorflow as tf
a = tf.constant([.0, .0, .0, .0], tf.float32)
b = tf.constant([1., 2., 3., 4.], tf.float32)
result1 = tf.nn.softmax(a)
result2 = tf.nn.softmax(b)
sess = tf.Session()
print(sess.run(result1))
print(sess.run(result2))

模型训练

mnist = input_data.read_data_sets(r"D:mnist\zip", one_hot=True)

把mnist数据集读取内存.读入方法的细节放在以后讨论.这里只有注意one_hot=True这个参数.one_hot表示用非零即1的数组保存图片表示的数值.比如一个图片上写的是0,内存中不是直接存一个0,而是存一个数组[1,0,0,0,0,0,0,0,0,0].一个图片上面写的是1,那个保存的就是[0,1,0,0,0,0,0,0,0,0]

x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x, W) + b

构造一个模型.为了说明问题方便,假定数据集中只有16张照片(这个假设在后面的内容中一直存在).那么y的最终结果是一个16*10的矩阵,每一行代表一张图片.

y_ = tf.placeholder(tf.float32, [None, 10])

定义一个占位符,用于图片上的数.上面已经介绍过,一个图片上面写的是1,那么保存的就是[0,1,0,0,0,0,0,0,0,0]. 如果现在有16张图片,y_就是一个16*10的矩阵.

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ /* tf.log(tf.nn.softmax(y)), reduction_indices=[1]))

reduction_indices是已经过时的参数,现在已经改成了axis,所以这个代码改为

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ /* tf.log(tf.nn.softmax(y)), axis=1))

上面已经说过y是一个16*10的矩阵,tf.nn.softmax(y)也是一个16*10的矩阵.只不过y的每一行被归一化到[0,1]之间.tf.log(tf.nn.softmax(y))是取自然对数,不影响结构.y_是16*10的矩阵,tf.log(tf.nn.softmax(y))也是16*10的矩阵,y_*tf.log(tf.nn.softmax(y))是把2个矩阵的对应项相乘.这一步起到的作用是把不是照片上数字的概率清0,这时候结果还是16*10的矩阵.tf.reduce_sum(y_ * tf.log(tf.nn.softmax(y)), axis=1)是把各列的值相加形成一个新的矩阵.这时候结果变成1维数组,长度是16.里面的值是分类正确的概率.因为这是正确的概率,希望正确的概率越大越好,但是梯度下降算法一般时求某个变量的极小值.所以前面要加一个负号.这是一种直观但不严谨的解释,更精度的解释见有关熵的概念.tf.reduce_mean作用是把数组各个元素加起来.我们希望cross_entropy越小越好,求cross_entropy的极小值要用到反向传播算法.算法原理要懂,细节tensorflow已经帮我们实现了.

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

这句的含义是训练的过程是求cross_entropy的极小值,学习率是0.5.下面开始看训练的代码.

batch_xs, batch_ys = mnist.train.next_batch(16)

这行代码的含义是从数据集中随机取出16张照片.每次训练所有照片效果理论上应该是比较好的,但是这样很花费时间和空间.所以每次随机取出若干张.这就是所谓的随机梯度下降算法.有关随机梯度下降算法收敛的原理这里不再讨论.batch_xs是一个16*784的矩阵,是训练的数据,batch_ys是一个16*10的矩阵,是训练数据的标签.

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

这行代码才是把实际数据放到x,y_中,以上面指定的模型和方法更新W和b的值,使损失函数不断减小.

评价训练结果

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

y,y_都是在后面才赋具体值的.为了描述方便.假设y是16*10的矩阵.y_是16*10的矩阵.tf.argmax(y, 1)返回的是一个长度为16的一维数组,里面是最大概率的索引.y_是16*10的矩阵.tf.argmax(y_, 1)返回的是一个长度为16的一维数组,里面是图片是是几的索引.tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))返回的是一个长度为16的bool型的数组.相等的话为True,不相等的话为False. True越多说明训练的结果越好.

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

tf.cast(correct_prediction, tf.float32)是把bool型数组转化为float型,True转化为1.0, False转化为0.0.reduce_mean时求float型数组的平均值,即正确的个数与所有个数之比.这个数越大越好,等于1说明100%分类正确.

sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})

feed_dict={x: mnist.test.images, y_: mnist.test.labels}是把实际的数据放到x,y_中.

tensorflow处理mnist(一)的更多相关文章

  1. Android+TensorFlow+CNN+MNIST 手写数字识别实现

    Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...

  2. Ubuntu16.04安装TensorFlow及Mnist训练

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com TensorFlow是Google开发的开源的深度学习框架,也是当前使用最广泛的深度学习框架. 一.安 ...

  3. 一个简单的TensorFlow可视化MNIST数据集识别程序

    下面是TensorFlow可视化MNIST数据集识别程序,可视化内容是,TensorFlow计算图,表(loss, 直方图, 标准差(stddev)) # -*- coding: utf-8 -*- ...

  4. 基于tensorflow的MNIST手写数字识别(二)--入门篇

    http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...

  5. 使用Tensorflow操作MNIST数据

    MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例.而TensorFlow的封装让使用MNIST数据集变得更加方便.MNIST数据集是NIST数据集的 ...

  6. TensorFlow RNN MNIST字符识别演示快速了解TF RNN核心框架

    TensorFlow RNN MNIST字符识别演示快速了解TF RNN核心框架 http://blog.sina.com.cn/s/blog_4b0020f30102wv4l.html

  7. 2、TensorFlow训练MNIST

    装载自:http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html TensorFlow训练MNIST 这个教程的目标读者是对机器学习和T ...

  8. 深入浅出TensorFlow(二):TensorFlow解决MNIST问题入门

    2017年2月16日,Google正式对外发布Google TensorFlow 1.0版本,并保证本次的发布版本API接口完全满足生产环境稳定性要求.这是TensorFlow的一个重要里程碑,标志着 ...

  9. Tensorflow之MNIST的最佳实践思路总结

    Tensorflow之MNIST的最佳实践思路总结   在上两篇文章中已经总结出了深层神经网络常用方法和Tensorflow的最佳实践所需要的知识点,如果对这些基础不熟悉,可以返回去看一下.在< ...

  10. TensorFlow训练MNIST报错ResourceExhaustedError

    title: TensorFlow训练MNIST报错ResourceExhaustedError date: 2018-04-01 12:35:44 categories: deep learning ...

随机推荐

  1. 手把手教你用netty撸一个ZkClient

    原文地址: https://juejin.im/post/5dd296c0e51d4508182449a6 前言 有这个想法的缘由是前一阵子突发奇想, 想尝试能不能直接利用js连接到zookeeper ...

  2. C语言|博客作业01

    2.1你对计算机科学与技术的了解是怎样? 一开始,我并不知道计科和软件的区别,甚至以为这是一种专业的两种叫法.进了大学之后,才一下子懂了,计科就是计科,它和软件虽有相同之处,但是终究是不一样的.计科涉 ...

  3. MySQL通过自定义函数实现递归查询父级ID或者子级ID

    背 景: 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度, 那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过left join来实现. 但很多时候我们是无 ...

  4. Head First设计模式——适配器和外观模式

    前言:为什么要一次讲解这两个模式,说点骚话:因为比较简单(*^_^*),其实是他们两个有相似和有时候我们容易搞混概念. 讲到这两个设计模式与另外一个“装饰者模式”也有相似,他们三个按照结构模式分类都属 ...

  5. 图解 Spring:HTTP 请求的处理流程与机制【3】

    3. HTTP 请求在 Web 应用中的处理流程 在穿越了 Web 容器之后,HTTP 请求将被投送到 Web 应用,我们继续以 Tomcat 为例剖析后续流程.Web 容器与 Web 应用的衔接是通 ...

  6. vim的各项指令

    lesson1 <ESC> 保证进入正常模式 :q!回车   退出编辑器 x 删除光标所在的字母 i 添加内容 A 自动追加内容到行尾 :wq 保存文件并退出 lesson2 dw 删除某 ...

  7. 使用selenium模拟登陆新浪微博

    1.selenium基本使用 1.selenium安装及基本操作 selenium是一个自动化测试工具,它支持各种浏览器,包括Chrome,Safari,Firefox等主流界面浏览器驱动,也包括Ph ...

  8. num += num 与 num = num+ num

    a = 100def test(num): num += num print(num) test(a)print(a) 200100 这里 num += num 与 num = num+ num 不能 ...

  9. 如何切换本地的GIT账号

    如何切换本地的GIT账号 1.为什么登陆第一次Git之后,就不用登陆了呢? 因为电脑已经将你的登陆凭据给保存起来了. 这也正是你不知道如何切换账号的原因. 2.在哪里能看已经保存的登陆凭证呢?并能够切 ...

  10. 2019-2020-1 20199304《Linux内核原理与分析》第一周作业

    通过对Linux基础课程的学习,我对Linux的背景以及和Windows的区别有了了解, Linux 平台:大都为开源自由软件,用户可以修改定制和再发布,由于基本免费没有资金支持,部分软件质量和体验欠 ...