![机器学习入门之 HelloWorld(上)](https://static001.infoq.cn/resource/image/75/54/7552c67248f7c2172e3da26f2f96df54.png)
初学机器学习,写篇文章 mark 一下,希望能为将入坑者解点惑。本文介绍一些机器学习的入门知识,从安装环境到跑通机器学习入门程序 MNIST demo。本篇为上篇。
内容提纲:
1.环境搭建
2.了解 Tensorflow 运行机制
3.MNIST(手写数字识别 ) softmax 性线回归
4.MNIST 深度卷积神经网络(CNN)
5.tools 工具类
6.CPU & GPU & multi GPU
1 环境搭建 (Windows)
安装虚拟环境 Anaconda,方便 python 包管理和环境隔离。
Anaconda3 4.2 https://www.anaconda.com/downloads,自带python 3.5。
创建 tensorflow 隔离环境。打开 Anaconda 安装后的终端 Anaconda Prompt,执行下面命令
CPU 版本
pip install tensorflow #通过包管理来安装
pip install whl-file #通过下载 whl 文件安装,tensorflow-cpu 安装包:http://mirrors.oa.com/tensorflow/windows/cpu/tensorflow-1.2.1-cp35-cp35m-win_amd64.whl, cp35 是指 python3.5
GPU 版本。我的笔记本是技持 NVIDIA 显卡的,可以安装 cuda,GPU 比 CPU 快很多,不过笔记本的显存不大,小模型还可以跑,大模型建议在本地用 CPU 跑通,到 Tesla 平台上训练。
![](https://static001.infoq.cn/resource/image/56/74/56b322f016930a288b78436b9a4eaf74.png)
注意点:选择正确的 CUDA 和 cuDNN 版本搭配,不要只安装最新版本,tensorflow 可能不支持。
目前 Tensorflow 已支持到 CUDA 9 & cuDNN 7,之前本人安装只支持 CUDA 8 & cuDNN 6,所以用是的:
CUDA8.1 https://developer.nvidia.com/cuda-80-ga2-download-archive
cudnn 6 https://developer.nvidia.com/cudnn ,将 cudnn 包解压,把文件放到 cuda 安装的对应目录中,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0,bin 对应 bin,include 对应 include,再添加 bin 目录到环境变量 path 中。
![](https://static001.infoq.cn/resource/image/7f/a8/7f0e837107684486db4c094d5a0f9fa8.png)
一些 python 工具包安装。用到啥安啥就行, pip install,不行就找源码编译安装
![](https://static001.infoq.cn/resource/image/c9/71/c98d5eee97753469de59c5d09afa6071.png)
2 了解 Tensorflow 运行机制
上代码。注意注释说明
![](https://static001.infoq.cn/resource/image/df/b0/df6f306049db4b538d5076dbbfd031b0.png)
Tensor。是一个句柄,代表一个运算的输出,但并没有存储运算输出的结果,需要通过 tf.Session.run(Tensor)或者 Tensor.eval()执行运算过程后,才能得到输出结果。A Tensor is a symbolic handle to one of the outputs of an Operation,It does not hold the values of that operation’s output, but instead provides a means of computing those values in a TensorFlow.
Tensorflow 运行过程:定义计算逻辑,构建图(Graph) => 通过会话(Session),获取结果数据。基本用法参见链接。
3 MNIST(手写数字识别 ) softmax 性线回归
分析
MNIST 是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
![](https://static001.infoq.cn/resource/image/4a/23/4a9319734325c9b089236d9157f69223.png)
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是 5,0,4,1。
数据集图片大小 28x28,单通道灰度图。存储样式如下:
![](https://static001.infoq.cn/resource/image/7d/17/7dcc96ab75caf164b385e16ad9bfaa17.png)
MNIST 手写数字识别的目的是输入这样的包含手写数字的 28x28 的图片,预测出图片中包含的数字。
softmax 线性回归认为图片中数字是 N 可能性由图像中每个像素点用
![](https://static001.infoq.cn/resource/image/d3/65/d3b38e1e0fa4f94b42204729fa5ded65.png)
表示是 数字 i 的可能性,计算出所有数字(0-9)的可能性,也就是所有数字置信度,然后把可能性最高的数字作为预测值。
evidence 的计算方式如下:
![](https://static001.infoq.cn/resource/image/65/75/650ed3836611212e254ef7b11bf83275.png)
其中
![](https://static001.infoq.cn/resource/image/ff/9b/ffbdfc94b01526255509bccfcd78ba9b.png)
代表权重,
![](https://static001.infoq.cn/resource/image/18/6a/1823bbe1fad10cafecfd124cfeb1a86a.png)
代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引(0~28x28=784),用于像素求和。即图片每个像素值 x 权重之和,再加上一个偏置 b,得到可能性值。
引入 softmax 的目的是对可能性值做归一化 normalize,让所有可能性之和为 1。这样可以把这些可能性转换成概率 y:
![](https://static001.infoq.cn/resource/image/e6/9c/e6ec1aa5c07eaeacfbaf87d627930d9c.png)
![](https://static001.infoq.cn/resource/image/5c/2a/5c33c21ef42990de2d8e6bcbf7e28b2a.png)
开始实现
数据
X 样本 size 28x28 = 784
![](https://static001.infoq.cn/resource/image/34/0a/34b0250c756447265c82ff9178503d0a.png)
Y 样本 ,样式如
![](https://static001.infoq.cn/resource/image/09/4e/09c964f56830c7cb3bf161d1a9ee7c4e.png)
读取
![](https://static001.infoq.cn/resource/image/4f/c2/4f370ad145212750cfd47a1e758f79c2.png)
构建图(Graph)
Inference 推理,由输入 x 到输出预测值 y 的推理过程
![](https://static001.infoq.cn/resource/image/54/dc/544f2bef4c9133af518e341b79c2b4dc.png)
![](https://static001.infoq.cn/resource/image/b0/c3/b04cebde37b6fc3cba738b6f483cc1c3.png)
![](https://static001.infoq.cn/resource/image/ec/7a/ec914555df3816808bd54e989221457a.png)
Loss 损失函数,分类一般采用交叉熵,这里用的是 softmax 交交叉熵。交叉熵是用来度量两个概率分布间的差异性信息,交叉熵公式如下:
![](https://static001.infoq.cn/resource/image/51/9b/51065bf0e996c50a75b4bccba809bc9b.png)
![](https://static001.infoq.cn/resource/image/b4/7c/b4577de17deef618ee1f46912002707c.png)
计算 loss 的方法有很多种,常见的还有 L1 loss 、L2 loss、sigmoid 交叉熵、联合 loss、自定义 loss…
Accuracy 准确率,预测值与真实值相同的概率。矩阵相乘输出 y 值是一个数组,tf.argmax 函数可能从数据中找出最大元素下标,预测值的最大值下标和真值的最大值下标一致即为正确。
![](https://static001.infoq.cn/resource/image/e2/72/e256fe38fa0b526bea1b8d495bec3f72.png)
Training 训练,训练的目的是让 Loss 接近最小化,预测值接近真值,Tensorflow 通过优化器 Optimizers 来实现。在 y = Wx+b 中,W、b 在训练之初会赋初值(随机 or 0),经过 Optimizer 不短优化,Loss 逼近最小值,使 W、b 不断接近理想值。W、b 一起共 784x10+10 个参数。
![](https://static001.infoq.cn/resource/image/77/bf/77f7549a7b6d6fba6626931e1e6aadbf.png)
minimize 函数:更新参数,让 Loss 最小化,包含两个步骤:计算梯度;更新参数。
![](https://static001.infoq.cn/resource/image/8a/9b/8a10221f51db01f383e0966e6e16c79b.png)
GradientDescentOptimizer:梯度下降算法优化器, Tensorflow 实现的是 SGD(随机梯度下降)。其缺点是依赖当前 batch,波动较大。
其它一些增强版 Optimizers:参考链接。 MomentumOptimizer、AdadeltaOptimizer、AdamOptimizer、RMSPropOptimizer、AdadeltaOptimizer …
Session:Tensorflow 需要通过 Session(会话)来执行推理运算,有两种创建方式,两者差别在于 InteractiveSession 会将自己设置为默认 session,有了默认 session,tensor.eval()才能执行。
![](https://static001.infoq.cn/resource/image/f8/e1/f8966e8804aba3fa5e5045c23d5b11e1.png)
也可以通过下设置默认 session:
![](https://static001.infoq.cn/resource/image/93/ac/93499420a760f06d5203b359997cb2ac.png)
配置 gpu 相关 session 参数:
![](https://static001.infoq.cn/resource/image/de/09/def187911b08fd36d405f1d735633d09.png)
一个网络的训练过程是一个不断迭代(前向+反向)的过程。前向算法由前向后计算网络各层输出,反向算法由后向前计算参数梯度,优化参数,减小 Loss。流程如图:
![](https://static001.infoq.cn/resource/image/c0/28/c0b67925fe0790b06a873b61da8d3a28.png)
注意:每隔一段时间输出一下网络 Loss 和 Accuracy,查看效果。每隔一段时间缓存一下网络参数,防止被突然中断,可再恢复。
模型参数的保存与恢复:
check point:默认保存方式。
pb:mobile 使用。
npz:字典保存方式,{name: value}, numpy 的一种保存方式。对参数按名保存,按名恢复。save 和 restore 方法自己控制,可以选择性保存和恢复。参见附近代码中【tools.py】save_npz_dict & load_and_assign_npz_dict 方法。
![](https://static001.infoq.cn/resource/image/ba/3f/bad8b8684b49b2a43fe115c7196e0e3f.png)
恢复:
![](https://static001.infoq.cn/resource/image/03/3e/03714a636d9486e2a307b4543d76de3e.png)
可视化。Tensorflow 提供 tensorboard 可视化工具,通过命令打开 web 服务,由浏览器查看,输入网址 http://localhost:6006
tensorboard --logdir=your-log-path #path 中不要出现中文
需要在训练过程指定相应 log 路径,写入相关信息
参考附件【sample.py】中 summary、writer 相关关键字代码。Graph 可视化:
![](https://static001.infoq.cn/resource/image/c7/19/c79d4c8ada65915bf73523dc39a1c519.png)
训练过程可视化:
![](https://static001.infoq.cn/resource/image/24/63/24f2f117125b38915ab64b2961177663.png)
batch size = 128, 训练集,验证集。可以看到 loss 在收敛,accuracy 在提高。由于训练集曲线反应的是当前 batch 的 loss 和 accuracy,batch size 相对不高,抖动较大。而验证集是全部图片进行测试,曲线较平滑。
评论