机器学习入门之 HelloWorld(上)

阅读数:68 2019 年 10 月 25 日 12:16

机器学习入门之 HelloWorld(上)

初学机器学习,写篇文章 mark 一下,希望能为将入坑者解点惑。本文介绍一些机器学习的入门知识,从安装环境到跑通机器学习入门程序 MNIST demo。本篇为上篇。

内容提纲:
1. 环境搭建
2. 了解 Tensorflow 运行机制
3.MNIST(手写数字识别 ) softmax 性线回归
4.MNIST 深度卷积神经网络(CNN)
5.tools 工具类
6.CPU & GPU & multi GPU

1 环境搭建 (Windows)

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 平台上训练。

机器学习入门之 HelloWorld(上)

注意点:选择正确的 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 中。

机器学习入门之 HelloWorld(上)

  • 一些 python 工具包安装。用到啥安啥就行, pip install,不行就找源码编译安装

机器学习入门之 HelloWorld(上)

2 了解 Tensorflow 运行机制

  • 上代码。注意注释说明

机器学习入门之 HelloWorld(上)

  • 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 是一个入门级的计算机视觉数据集,它包含各种手写数字图片:

机器学习入门之 HelloWorld(上)

它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是 5,0,4,1。

数据集图片大小 28x28,单通道灰度图。存储样式如下:

机器学习入门之 HelloWorld(上)

MNIST 手写数字识别的目的是输入这样的包含手写数字的 28x28 的图片,预测出图片中包含的数字。

softmax 线性回归认为图片中数字是 N 可能性由图像中每个像素点用

机器学习入门之 HelloWorld(上)

表示是 数字 i 的可能性,计算出所有数字(0-9)的可能性,也就是所有数字置信度,然后把可能性最高的数字作为预测值。

evidence 的计算方式如下:

机器学习入门之 HelloWorld(上)

其中

机器学习入门之 HelloWorld(上)

代表权重,

机器学习入门之 HelloWorld(上)

代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引(0~28x28=784),用于像素求和。即图片每个像素值 x 权重之和,再加上一个偏置 b,得到可能性值。

引入 softmax 的目的是对可能性值做归一化 normalize,让所有可能性之和为 1。这样可以把这些可能性转换成概率 y:

机器学习入门之 HelloWorld(上)
机器学习入门之 HelloWorld(上)

  • 开始实现

数据

X 样本 size 28x28 = 784

机器学习入门之 HelloWorld(上)

Y 样本 ,样式如

机器学习入门之 HelloWorld(上)

读取

机器学习入门之 HelloWorld(上)

构建图 (Graph)

Inference 推理,由输入 x 到输出预测值 y 的推理过程

机器学习入门之 HelloWorld(上)
机器学习入门之 HelloWorld(上)
机器学习入门之 HelloWorld(上)

Loss 损失函数,分类一般采用交叉熵,这里用的是 softmax 交交叉熵。交叉熵是用来度量两个概率分布间的差异性信息,交叉熵公式如下:

机器学习入门之 HelloWorld(上)
机器学习入门之 HelloWorld(上)

计算 loss 的方法有很多种,常见的还有 L1 loss 、L2 loss、sigmoid 交叉熵、联合 loss、自定义 loss…

Accuracy 准确率,预测值与真实值相同的概率。矩阵相乘输出 y 值是一个数组,tf.argmax 函数可能从数据中找出最大元素下标,预测值的最大值下标和真值的最大值下标一致即为正确。

机器学习入门之 HelloWorld(上)

Training 训练,训练的目的是让 Loss 接近最小化,预测值接近真值,Tensorflow 通过优化器 Optimizers 来实现。在 y = Wx+b 中,W、b 在训练之初会赋初值(随机 or 0),经过 Optimizer 不短优化,Loss 逼近最小值,使 W、b 不断接近理想值。W、b 一起共 784x10+10 个参数。

机器学习入门之 HelloWorld(上)

minimize 函数:更新参数,让 Loss 最小化,包含两个步骤:计算梯度;更新参数。

机器学习入门之 HelloWorld(上)

GradientDescentOptimizer:梯度下降算法优化器, Tensorflow 实现的是 SGD(随机梯度下降)。其缺点是依赖当前 batch,波动较大。

其它一些增强版 Optimizers:参考链接。 MomentumOptimizer、AdadeltaOptimizer、AdamOptimizer、RMSPropOptimizer、AdadeltaOptimizer …

Session:Tensorflow 需要通过 Session(会话)来执行推理运算,有两种创建方式,两者差别在于 InteractiveSession 会将自己设置为默认 session,有了默认 session,tensor.eval() 才能执行。

机器学习入门之 HelloWorld(上)

也可以通过下设置默认 session:

机器学习入门之 HelloWorld(上)

配置 gpu 相关 session 参数:

机器学习入门之 HelloWorld(上)

一个网络的训练过程是一个不断迭代(前向 + 反向)的过程。前向算法由前向后计算网络各层输出,反向算法由后向前计算参数梯度,优化参数,减小 Loss。流程如图:

机器学习入门之 HelloWorld(上)

注意:每隔一段时间输出一下网络 Loss 和 Accuracy,查看效果。每隔一段时间缓存一下网络参数,防止被突然中断,可再恢复。

模型参数的保存与恢复:

check point:默认保存方式。

pb:mobile 使用。

npz:字典保存方式,{name: value}, numpy 的一种保存方式。对参数按名保存,按名恢复。save 和 restore 方法自己控制,可以选择性保存和恢复。参见附近代码中【 tools.py 】save_npz_dict & load_and_assign_npz_dict 方法。

机器学习入门之 HelloWorld(上)

恢复:

复制代码
#check point
saver = tf.train.Saver(max_to_keep = 3, write_version = 2)model_file=tf.train.latest_checkpoint(FLAGS.log_dir)if model_file:
saver.restore(sess, model_file)#npz
tools.load_and_assign_npz_dict(name=FLAGS.log_dir+'/model.npz', sess=sess)) 打印网络中各参数信息:方便查看网络参数是否正确。

机器学习入门之 HelloWorld(上)

可视化。Tensorflow 提供 tensorboard 可视化工具,通过命令打开 web 服务,由浏览器查看,输入网址 http://localhost:6006

tensorboard --logdir=your-log-path #path 中不要出现中文
需要在训练过程指定相应 log 路径,写入相关信息
参考附件【 sample.py 】中 summary、writer 相关关键字代码。Graph 可视化:

机器学习入门之 HelloWorld(上)

训练过程可视化:

机器学习入门之 HelloWorld(上)

batch size = 128, 训练集,验证集。可以看到 loss 在收敛,accuracy 在提高。由于训练集曲线反应的是当前 batch 的 loss 和 accuracy,batch size 相对不高,抖动较大。而验证集是全部图片进行测试,曲线较平滑。

评论

发布