上一篇关于OCR字符识别,用的一般的数字图像处理的方法以及经典监督式分类器KNN进行模型构建,虽然实时性比较高,但是却不能作为大规模识别方法,显然我的数据是不够的。
后面的内容,我打算完善OCR手写数字识别这个模块,借助编程框架Tensorflow于linux上采用几种主流的深度学习算法实现MNIST数据集的完美分类。既然是项目,那就必须要做些实用性的东西,开发一个web接口服务器(支持AJAX请求、数据持久化、用户认证,任务队列,数据文件上传等功能),与深度学习的服务相结合,开发一个图像识别系统,搭建一个小型完备的深度学习服务云平台。
今天讲第一步:准备工作,关于linux学习深度学习的几个建议。
Tip1:使用linux(Ubuntu为例),一定要关闭客人会话
ubuntu中的客人模式是个很烦人的东西,其本意是保护隐私的设计,当经常不小心开启而且你还关不掉。所以,干脆关了它!关闭方法很简单:
1. 进入tty1控制台(ctrl+alt+f1),root省份登录
2. 使用Vi编辑器配置文件:sudo vi /etc/lightdm/lightdm.conf
3. 编辑文件(i键进入编辑模式,Esc键退出编辑)
[SeatDefaults]
greeter-session=unity-greeter
allow-guest=false
4. Esc后,输入“:”,按“x”退出并保存
5.重启系统:sudo reboot
Tip2:Anaconda是搭建深度学习环境的首选
理由:
1. 虽然ubuntu系统自带Python,当有时候为了后面搭建环境的要求,版本不匹配,那就要自行安装一个版本,自行安装版本你不管还好,要是你修改默认Python版本操作失误了,极有可能出现打开不了终端的情况(ctrl+alt+T)。(补救办法:其实就是重命名文件,比如ubuntu16.04自带3.5版本的Python,你安装了3.6版本的,那么需要在tty1终端下,进入路径 /usr/lib/python3/dist-packages/gi/, ls查看目录,将里面的_gi_cairo.cpython-35m-x86_64-linux-g文件和_gi.cpython-35m-x86_64-linux-gnu.so文件需要重命名或复制一份为:_gi_cairo.cpython-36m-x86_64-linux-g和_gi.cpython-36m-x86_64-linux-gnu.so,然后重启即可)用Anaconda的话,几乎都是自动设置好的,包括后面需要的大部分python已来包都给安装好了。
2.可以conda创建虚拟环境,在不同的虚拟环境中,你可以安装不同的框架,而且彼此互不影响(python解释器的路径不同罢了),比如我创建了三个虚拟环境,分别装上了caffe,tensorflow,theano三个学习框架,本文记录的项目使用Tenserflow框架,不过Tensorflow也有不合适的地方,比如不支持双向RNN和3D卷积神经网络,而Theano则提供了较好的支持。
关于Anaconda和Tensorflow的安装,这里我就不说了,网上教程太多太多了,只不过注意的是,版本一定要匹配,否则import tensorflow的时候会报错,这里可以参考这个来选择版本:https://github.com/lakshayg/tensorflow-build
另外,如果提示你CPU还有待优化项,别管他,直接屏蔽建议就行,不影响程序执行
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
Tensorflow入门级案例
这个是我在一段程序中截取出来的,可以很好地表达Tensorflow用法:
import tensorflow as tf
import numpy as np
#使用numpy生成100个随机点
x_data=np.random.rand(100)
y_data=x_data*0.1+0.2
#构造一个线性模型
b=tf.Variable(0.0) #初始化为0
k=tf.Variable(0.0)
y=k*x_data+b
#二次代价函数
loss=tf.reduce_mean(tf.square(y_data-y))
#定义一个梯度下降法来进行训练的优化器
optimizer=tf.train.GradientDescentOptimizer(0.2) #梯度下降优化其器,学习率为0.2
#最小化代价函数(越小越好)
train=optimizer.minimize(loss)
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for step in range(201): #迭代200次
sess.run(train)
if step%20==0: #每20次打印k和b的值
print(step,sess.run([k,b])) #k越来越接近0.1,b越来越接近0.2
Tensorflow与一般python写代码的主要区别就是它要先定义图和op,再去执行操作。例子其实就是一个线性关系的拟合,使用了Tensorflow封装好的梯度下降方法作为优化器(想知道算法原理可以去看老周的机器学习西瓜书),最后迭代200次,每20次打印一下k和b的值,最后结果这样