初学机器学习,写篇文章 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 平台上训练。
注意点:选择正确的 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 中。
一些 python 工具包安装。用到啥安啥就行, pip install,不行就找源码编译安装
2 了解 Tensorflow 运行机制
上代码。注意注释说明
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 是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是 5,0,4,1。
数据集图片大小 28x28,单通道灰度图。存储样式如下:
MNIST 手写数字识别的目的是输入这样的包含手写数字的 28x28 的图片,预测出图片中包含的数字。
softmax 线性回归认为图片中数字是 N 可能性由图像中每个像素点用
表示是 数字 i 的可能性,计算出所有数字(0-9)的可能性,也就是所有数字置信度,然后把可能性最高的数字作为预测值。
evidence 的计算方式如下:
其中
代表权重,
代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引(0~28x28=784),用于像素求和。即图片每个像素值 x 权重之和,再加上一个偏置 b,得到可能性值。
引入 softmax 的目的是对可能性值做归一化 normalize,让所有可能性之和为 1。这样可以把这些可能性转换成概率 y:
开始实现
数据
X 样本 size 28x28 = 784
Y 样本 ,样式如
读取
构建图(Graph)
Inference 推理,由输入 x 到输出预测值 y 的推理过程
Loss 损失函数,分类一般采用交叉熵,这里用的是 softmax 交交叉熵。交叉熵是用来度量两个概率分布间的差异性信息,交叉熵公式如下:
计算 loss 的方法有很多种,常见的还有 L1 loss 、L2 loss、sigmoid 交叉熵、联合 loss、自定义 loss…
Accuracy 准确率,预测值与真实值相同的概率。矩阵相乘输出 y 值是一个数组,tf.argmax 函数可能从数据中找出最大元素下标,预测值的最大值下标和真值的最大值下标一致即为正确。
Training 训练,训练的目的是让 Loss 接近最小化,预测值接近真值,Tensorflow 通过优化器 Optimizers 来实现。在 y = Wx+b 中,W、b 在训练之初会赋初值(随机 or 0),经过 Optimizer 不短优化,Loss 逼近最小值,使 W、b 不断接近理想值。W、b 一起共 784x10+10 个参数。
minimize 函数:更新参数,让 Loss 最小化,包含两个步骤:计算梯度;更新参数。
GradientDescentOptimizer:梯度下降算法优化器, Tensorflow 实现的是 SGD(随机梯度下降)。其缺点是依赖当前 batch,波动较大。
其它一些增强版 Optimizers:参考链接。 MomentumOptimizer、AdadeltaOptimizer、AdamOptimizer、RMSPropOptimizer、AdadeltaOptimizer …
Session:Tensorflow 需要通过 Session(会话)来执行推理运算,有两种创建方式,两者差别在于 InteractiveSession 会将自己设置为默认 session,有了默认 session,tensor.eval()才能执行。
也可以通过下设置默认 session:
配置 gpu 相关 session 参数:
一个网络的训练过程是一个不断迭代(前向+反向)的过程。前向算法由前向后计算网络各层输出,反向算法由后向前计算参数梯度,优化参数,减小 Loss。流程如图:
注意:每隔一段时间输出一下网络 Loss 和 Accuracy,查看效果。每隔一段时间缓存一下网络参数,防止被突然中断,可再恢复。
模型参数的保存与恢复:
check point:默认保存方式。
pb:mobile 使用。
npz:字典保存方式,{name: value}, numpy 的一种保存方式。对参数按名保存,按名恢复。save 和 restore 方法自己控制,可以选择性保存和恢复。参见附近代码中【tools.py】save_npz_dict & load_and_assign_npz_dict 方法。
恢复:
可视化。Tensorflow 提供 tensorboard 可视化工具,通过命令打开 web 服务,由浏览器查看,输入网址 http://localhost:6006
tensorboard --logdir=your-log-path #path 中不要出现中文
需要在训练过程指定相应 log 路径,写入相关信息
参考附件【sample.py】中 summary、writer 相关关键字代码。Graph 可视化:
训练过程可视化:
batch size = 128, 训练集,验证集。可以看到 loss 在收敛,accuracy 在提高。由于训练集曲线反应的是当前 batch 的 loss 和 accuracy,batch size 相对不高,抖动较大。而验证集是全部图片进行测试,曲线较平滑。
评论