写点什么

机器学习入门之 HelloWorld(上)

2019 年 10 月 25 日

机器学习入门之 HelloWorld(上)

初学机器学习,写篇文章 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 方法。



恢复:


#check pointsaver = 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)#npztools.load_and_assign_npz_dict(name=FLAGS.log_dir+'/model.npz', sess=sess))打印网络中各参数信息:方便查看网络参数是否正确。
复制代码



可视化。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 相对不高,抖动较大。而验证集是全部图片进行测试,曲线较平滑。


2019 年 10 月 25 日 12:16288

评论

发布
暂无评论
发现更多内容

架构师训练营第 0 期第三周学习总结

无名氏

第三周学习总结

傻傻的帅

学习 设计思维

架构师训练营第 03 周—— 练习

李伟

极客大学架构师训练营

手写

AIK

Week03 作业

极客大学架构师训练营

GoF 23种设计模式之单例模式

无心水

架构师 单例模式 极客大学架构师训练营 GoF 23种设计模式

本周学习总结

Geek_zhangjian

架构师第三周作业

傻傻的帅

设计模式 极客大学架构师训练营

架构师训练 - 第三周作业

X﹏X

第3周学习总结

Glowry

极客大学架构师训练营

游戏夜读 | 玩游戏能得到什么?

game1night

第二周

Geek_zhangjian

第三周作业一

潜默闻雨

第三周总结

小树林

架构师训练营第三章总结

吴吴

第三周-总结

铁血杰克

Week3 - 总结

Coder

极客大学架构师训练营

week3

AIK

小师妹学JVM之:JIT中的PrintCompilation

程序那些事

JVM Java 25 周年 小师妹 性能调优 JIT

2020-06-20-第三周作业

路易斯李李李

架构师的基本能力之代码重构

_MISSYOURLOVE

极客大学架构师训练营

第三周作业

小树林

第三周作业

大雄

架构师训练营第 0 期第三周作业

无名氏

单例模式 组合模式

架构师训练营 -week3- 学习总结

晓-Michelle

极客大学架构师训练营

面试官:CAP都搞不清楚,别跟我说你懂微服务!

码农神说

分布式 漫画 CAP

第三周总结

大雄

架构师训练营 Week 03 作业

Wancho

Java反射与内省(参考小米内部资料)

知春秋

Java 反射 内省

第三周-作业

铁血杰克

设计模式(Dessert)

Arvin

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