TensorFlow笔记——关于MNIST数据的一个简单的例子
这个程序参考自极客学院。
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
# MNIST数据存放的路径
file = "./MNIST"
# 导入数据
mnist = input_data.read_data_sets(file, one_hot=True)
# 模型的输入和输出
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])
# 模型的权重和偏移量
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
# 创建Session
sess = tf.InteractiveSession()
# 初始化权重变量
sess.run(tf.global_variables_initializer())
y = tf.nn.softmax(tf.matmul(x, W) + b)
# 交叉熵
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
# 训练
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
for i in range(1000):
batch = mnist.train.next_batch(50)
train_step.run(feed_dict={x: batch[0], y_: batch[1]})
# 测试
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_:mnist.test.labels}))
注释:
# MNIST数据存放的路径
file = "./MNIST"
# 导入数据
mnist = input_data.read_data_sets(file, one_hot=True)
将下载MNIST数据到./MNIST/文件夹下,此过程可能会由于网络问题而出错。建议自己从MNIST官网下载。将下载好的文件放到上述路径下即可。input_data.read_data_sets()函数可以自动检测指定目录下是否存在MNIST数据,如果存在,就不会下载了。
# 模型的输入和输出
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])
这里x和y不是特定的值。它们是表示输入和输出的占位符,可以在进行计算的时候进行赋值。
模型的输入x是一个2维的浮点数张量。它的大小为shape=[None, 784],其中784是一张展平的MNIST图片的维度。None表示其值不固定。输出y_也是一个2维张量,它的每一行都是一个10维的one-hot向量,用来表示对应的MNIST图片的类别。
# 模型的权重和偏移量
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
变量W和b是线性模型的参数,这个线性模型用如下表达式表示:
其中,y_和x分别表示上述模型的输入和输出。W是一个784∗10的矩阵,因为输入有784个特征,同时有10个输出值。b是一个10维的向量,是因为输出有10个分类。
# 创建Session
sess = tf.InteractiveSession()
# 初始化权重变量
# 以前版本的初始化代码是
# sess.run(tf.initialize_all_variables())
sess.run(tf.global_variables_initializer())
变量需要经过初始化才可以在Session中使用。
# 构建回归模型
y = tf.nn.softmax(tf.matmul(x, W) + b)
把向量化后的图片x和权重矩阵W相乘,加上偏移量b,然后计算每个分类的softmax概率值。
# 交叉熵
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
为训练过程指定损失函数,损失函数是用来评估模型一次预测的好与坏的。在这里使用目标类别和预测类别之间的交叉熵作为我们的损失函数。交叉熵定义如下:
其中y_表示目标类别,也就是真实值。y是预测类别,就是模型的输出值。
# 训练
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
for i in range(1000):
batch = mnist.train.next_batch(50)
train_step.run(feed_dict={x: batch[0], y_: batch[1]})
这里我们使用TensorFlow内置的梯度下降来进行优化,即让损失函数的值下降,步长为0.01。然后通过循环,不断地训练模型。每次循环,都会从训练集中加载50个样本。
# 测试
# 这里返回一个布尔数组,形如[True, False, True]
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
# 将布尔数组转换为浮点数,并取平均值,如上布尔数组可以转换为[1, 0, 1],计算平均值为0.667
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 计算在测试数据上的准确率
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_:mnist.test.labels}))
模型到这里就构建完成了,但这个模型到底好不好,我们并不知道。所以需要在测试集上验证模型的泛化能力。
最后,这个模型的准确率约为0.91,结果如下:
TensorFlow笔记——关于MNIST数据的一个简单的例子的更多相关文章
- tensorflow笔记:流程,概念和简单代码注释
tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
- Struts2的配置和一个简单的例子
Struts2的配置和一个简单的例子 笔记仓库:https://github.com/nnngu/LearningNotes 简介 这篇文章主要讲如何在 IntelliJ IDEA 中使用 Strut ...
- 一个简单的例子搞懂ES6之Promise
ES5中实现异步的常见方式不外乎以下几种: 1. 回调函数 2. 事件驱动 2. 自定义事件(根本上原理同事件驱动相同) 而ES6中的Promise的出现就使得异步变得非常简单.promise中的异步 ...
- Linux内核中的信号机制--一个简单的例子【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...
- 从一个简单的例子谈谈package与import机制
转,原文:http://annie09.iteye.com/blog/469997 http://blog.csdn.net/gdsy/article/details/398072 这两篇我也不知道到 ...
- 用一个简单的例子来理解python高阶函数
============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...
- Spring-Context之一:一个简单的例子
很久之前就想系统的学习和掌握Spring框架,但是拖了很久都没有行动.现在趁着在外出差杂事不多,就花时间来由浅入深的研究下Spring框架.Spring框架这几年来已经发展成为一个巨无霸产品.从最初的 ...
- 关于apriori算法的一个简单的例子
apriori算法是关联规则挖掘中很基础也很经典的一个算法,我认为很多教程出现大堆的公式不是很适合一个初学者理解.因此,本文列举一个简单的例子来演示下apriori算法的整个步骤. 下面这个表格是代表 ...
随机推荐
- nodejs server启动写法
http://www.phpstudy.net/c.php/18720.html node不利用框架怎么实现对静态HTML.css.js的服务? 初学nodeJS,在使用nodejs构建静态文件服务器 ...
- poj2125最小点权覆盖+找一个割集
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8503 Accepted: 2 ...
- A == B ?(hdu2054)
输入格式:直接循环,同时输入两个不带空格未知长度的字符串. 思考:不带空格未知长度且同时输入,用两个char s[maxsize]定义两个字符数组,再用scanf_s()函数同时输入两个字符串. 注意 ...
- Socket - TCP编程
Socket是网络编程的一个抽象概念. 通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可 socket参数及常用功能 ...
- shrio的springboot完整配置
package com.zys.sys.config; import java.util.HashMap; import java.util.Map; import javax.servlet.Fil ...
- RabbitMQ(1)---基本概念
一.安装RabbitMQ 安装直接用docker安装,如果手动安装的话比较繁琐,还要安装erlang语言的环境.在安装有docker机器上执行官网提供的指令(https://www.rabbitmq. ...
- Network Motif 文献调研
Network Motif 文献调研 概述:Network motifs,可以认为是网络中频繁出现的子图模式,是复杂网络的"构建块".有两篇发表在science上的论文给出moti ...
- 【JVM】体系结构及其细节
JVM JVM运行在操作系统之上,与硬件没有直接的交互.引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语 ...
- python的转义
print('"I\'m OK"') print("I'm OK") print('"I"\'m \"OK"') &qu ...
- 应用4:利用Filter限制用户浏览权限
1. 使用 Filter 完成一个简单的权限模型: 1). 需求: ①. 管理权限 > 查看某人的权限 > 修改某人的权限 ②. 对访问进行权限控制: 有权限则可以访问, 否则提示: 没有 ...