TF.Learn 手写文字识别
minist问题
- 计算机视觉领域的Hello world
- 给定55000个图片,处理成28*28的二维矩阵,矩阵中每个值表示一个像素点的灰度,作为feature
- 给定每张图片对应的字符,作为label,总共有10个label,是一个多分类问题
Tensor Flow
- 可以按教程用Docker安装,也可以直接在Linux上安装
- 你可能会担心,不用Docker的话怎么开那个notebook呢?其实notebook就在主讲人的Github页(https://github.com/random-forests/tutorials)上
- 可以用这个Chrome插件:npviewer(https://chrome.google.com/webstore/detail/open-in-nbviewer/ihlhlehlibooakiicbiakgojckpnlali?hl=zh-CN)直接在浏览器中阅读ipynb格式的文件,而不用在本地启动iPython notebook
- 我们的教程在这里:ep7.ipynb(https://github.com/random-forests/tutorials/blob/master/ep7.ipynb)
- 把代码从ipython notebook中整理出来:tflearn_mnist.py(https://github.com/ahangchen/GoogleML/blob/master/src/tflearn_mnist.py)
代码分析
下载数据集
mnist = learn.datasets.load_dataset('mnist')
恩,就是这么简单,一行代码下载解压mnist数据,每个img已经灰度化成长784的数组,每个label已经one-hot成长度10的数组
numpy读取图像到内存,用于后续操作,包括训练集(只取前10000个)和验证集
data = mnist.train.images
labels = np.asarray(mnist.train.labels, dtype=np.int32)
test_data = mnist.
test.images test_labels = np.asarray(mnist.test.labels, dtype=np.int32)
max_examples = 10000
data = data[:max_examples]
labels = labels[:max_examples]
可视化图像
def display(i):
img = test_data[i]
plt.title('Example %d. Label: %d' % (i, test_labels[i]))
plt.imshow(img.reshape((28, 28)), cmap=plt.cm.gray_r)
plt.show()
用matplotlib展示灰度图
训练分类器
提取特征(这里每个图的特征就是784个像素值)
feature_columns = learn.infer_real_valued_columns_from_input(data)
创建线性分类器并训练
classifier = learn.LinearClassifier(feature_columns=feature_columns, n_classes=10) classifier.fit(data, labels, batch_size=100, steps=1000)
注意要制定n_classes为labels的数量
- 分类器实际上是在根据每个feature判断每个label的可能性,
- 不同的feature有的重要,有的不重要,所以需要设置不同的权重
- 一开始权重都是随机的,在fit的过程中,实际上就是在调整权重
- 最后可能性最高的label就会作为预测输出
- 传入测试集,预测,评估分类效果
result = classifier.evaluate(test_data, test_labels)print result["accuracy"]
速度非常快,而且准确率达到91.4%
可以只预测某张图,并查看预测是否跟实际图形一致
# here's one it gets right
print ("Predicted %d, Label: %d" % (classifier.predict(test_data[0]), test_labels[0])) display(0)
# and one it gets wrong
print ("Predicted %d, Label: %d" % (classifier.predict(test_data[8]), test_labels[8])) display(8)
可视化权重以了解分类器的工作原理
weights = classifier.weights_
a.imshow(weights.T[i].reshape(28, 28), cmap=plt.cm.seismic)
weight可视化
从上图可知:
1、这里展示了8个张图中,每个像素点(也就是feature)的weights,
2、红色表示正的权重,蓝色表示负的权重
3、作用越大的像素,它的颜色越深,也就是权重越大
4、所以权重中红色部分几乎展示了正确的数字
Next steps
- TensorFlow Docker images(https://hub.docker.com/r/tensorflow/tensorflow/)
- TF.Learn Quickstart(https://www.tensorflow.org/versions/r0.9/tutorials/tflearn/index.html)
- MNIST tutorial(https://www.tensorflow.org/tutorials/mnist/beginners/index.html)
- Visualizating MNIST(http://colah.github.io/posts/2014-10-Visualizing-MNIST/)
- Additional notebooks(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/docker/notebooks)
- More about linear classifiers(https://www.tensorflow.org/versions/r0.10/tutorials/linear/overview.html#large-scale-linear-models-with-tensorflow)
- Much more about linear classifiers(http://cs231n.github.io/linear-classify/)
- Additional TF.Learn samples(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/skflow)
Github工程地址 https://github.com/ahangchen/GoogleML
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL如何管理客户端的连接?
- 鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
- MySQL如何管理客户端连接?线程池篇
- 让python装饰器不再晦涩难懂
- Android开发3年,九月份面试12家大厂跳槽成功,我有一些面试经验想分享给你们
- MySQL的防火墙功能
- Java中线程池的参数有几个?
- MySQL企业版备份工具MEB
- python生成器函数的应用场景举例---为copy过程添加进度条显示
- 短网址程序YOURLS安装及配置教程与设置中文
- MGR用哪个版本?5.7 vs 8.0
- 同事直呼666!小姐姐仅用3行代码就能玩出花来
- MySQL升级至8.0需要考虑哪些因素?
- 某云Music——JS破解全过程
- 和低效 IO 说再见,回头补一波 Java 7 的 NIO.2 特性