逻辑回归 | TensorFlow深度学习笔记

课程目标:学习简单的数据展示,训练一个Logistics Classifier,熟悉以后要使用的数据

Install Ipython NoteBook

可以参考这个 教程 (http://opentechschool.github.io/python-data-intro/core/notebook.html)

  • 可以直接安装 anaconda (https://www.anaconda.com/download/),里面包含了各种库,也包含了ipython;
  • 推荐使用python2的版本,因为很多lib只支持python2,而且python3在升级中,支持3.4还是3.5是个很纠结的问题。

安装anaconda后直接在终端输入 ipython notebook,则会运行一个ipython的server端,同时在你的浏览器中打开基于你终端目录的一个页面:

点开ipynb文件即可进入文件编辑页面

上图即为practical部分的教程,可以在github下载

(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/udacity)

官方推荐使用docker来进行这部分教程,但简单起见我们先用ipython notebook

Install TensorFlow

安装教程就在TensorFlow的github页上

按照官方的流程装就好了,这里讲一下几种方式的特点:

1、pip: 安装在全局的python解释器中,简单

2、Third party: Virtualenv, Anaconda and Docker:都能创建tensorflow独立的编译环境,但就是多了一份包

3、Source: 能够适应不同的python版本(比如编译一个3.5版的),但源码编译可能有许多坑

4、ubuntu安装时,需要注意自己的python - pip - tensorflow版本是否对应(比如是否都是2.7),

5、使用sudo命令时,注意自己的环境变量是否变化(会导致pip或python命令对应的版本变化)

6、具体讲一下ubuntu安装tensorflow流程:

1、安装anaconda2 2、确定自己终端的pip和python版本

$ pip -V && python -V

确认使用的是否都来自anaconda,如果不是,则应该使用类似这样的命令运行对应的pip:

$ /home/cwh/anaconda2/bin/pip -V

使用sudo命令时最好也看一下版本

3、使用anaconda创建一个tensorflow虚拟环境

$ conda create -n tensorflow python=2.7

4、切换到tensorflow环境下(实际上是更换了环境变量里的pip和python),下载安装tensorflow,需要sudo权限

$ source activate tensorflow (tensorflow)$ sudo pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0rc0-cp27-none-linux_x86_64.wh $ source deactivate

notMNIST

修改的 MNIST(

http://yann.lecun.com/exdb/mnist/),不够干净,更接近真实数据,比MNIST任务更困难。

Todo

我将官方教程的一个文件拆成了多个(以文件持久化为边界),然后在schedule.py(https://github.com/ahangchen/GDLnotes/blob/master/src/assign_1/schedule.py) 里统一调用,在各个文件里可以执行各个部分的功能测试。

下载

代码示例:load_data.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/load_data.py)

使用urlretrieve来获取数据集notMNIST_large.tar.gz和notMNIST_small.tar.gz

解压

使用tarfile模块来解压刚刚下载的压缩包

代码示例:extract.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/extract.py)

读图-展示-序列化

1、用ndimage读取一部分图片,用pickle将读取到的对象(ndarray对象的list)序列化存储到磁盘

2、用matplotlib.plot.imshow实现图片显示,可以展示任意的numpy.ndarray,详见show_imgs(dataset)

3、这里展示的是二值化图片,可以设置显示为灰度图

4、将每个class对应的图像数据集序列化到磁盘

代码示例:img_pickle.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/img_pickle.py)

整理数据集

1、用pickle读取pickle文件,

2、从train_folder中为10个class分别获取10000个valid_dataset和20000个train_dataset,

3、其中对每个class读取到的数据,用random.shuffle将数据乱序化

4、将各个class及其对应的label序列化到磁盘,分别为训练器和校验集

5、从test_folder中为10个class分别获取10000个test_dataset,

6、其中对每个class读取到的数据,用random.shuffle将数据乱序化

7、将各个class及其对应的label序列化到磁盘,作为测试集

代码示例merge_prune.py (https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/merge_prune.py)

去除重复数据

1、load_pickle,加载dataset

2、先将valid_dataset中与test_dataset重复部分剔除,再将train_dataset中与valid_dataset重复部分剔除

3、每个dataset都是一个二维浮点数组的list,也可以理解为三维浮点数组,

4、比较list中的每个图,也就是将list1中每个二维浮点数组与list2中每个二维浮点数组比较

5、示例代码即为clean_overlap.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/clean_overlap.py)中的imgs_idx_except

6、我们在拿list1中的一个元素跟list2中的一个元素比较时,总共需要比较len(list1) * len(list2) * image_size * image_size次,速度极慢

7、实际上这是有重复的计算的,就在于,list2中的每个元素,都被遍历了len(list1)次

8、因此有这样的一个优化,我们遍历每个图,用图中的灰度值,仿照BKDRHash,得到每个图都不同的hash值,比较hash值来比较图像

9、示例代码即为clean_overlap.py (https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/clean_overlap.py)中的imgs_idx_hash_except

10、这样每个图都只需要访问一次,计算hash的时间变为(len(list1) + len(list2)) * image_size * image_size

11、比较的次数是len(list1) * len(list2)

12、由于我们的数据中,list1和list2的长度是大数,所以节省的时间是相当可观的

13、在我的机器上,比较完valid_dataset和test_dataset需要的时间分别是25000秒(10000次比较,每次2-3秒)和60秒

14、然后再将清理后的数据序列化到磁盘即可

代码示例: clean_overlap.py(https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/clean_overlap.py)

训练一个logistics 模型

1、将train_dataset作为输入,用valid_dataset进行验证(预测成功率82.5%)

2、为了重复利用训练后的分类器,将其序列化到磁盘

代码示例: logistic_train.py (https://github.com/ahangchen/GDLnotes/blob/master/src/not_mnist/logistic_train.py)

Measure Performance

1、分类器会尝试去记住训练集

2、遇到训练集中没有的数据时,分类器可能就没辙了

3、所以我们应该measure的是,分类器如何产生新数据(生成能力(推导能力)越大,说明它应对新数据能力越强)

4、仅measure分类器记忆数据集的能力并不能应对新数据(没有学到规律),所以不应该拿旧数据去measure

5、因此measure的方式应该是拿新数据去看分类器的预测准确度(never see, can't memorize)

6、但是在measure的过程中,我们会根据测试数据去重新调整分类器,使其对所有测试数据都生效

7、也就是说测试数据变成了训练集的一部分,因此这部分数据我们只能作为valid_dataset,而不能用于衡量最后的performance

8、解决方法之一即,最终进行performance measure的数据集,必须是调整分类器的过程中没有使用过的

9、即坚持一个原则,测试数据不用于训练

在机器学习比赛Kaggle中,有public data,validate data,并有用于测试(选手未知)的private data,只有在训练时自己的分类器时,预先取一部分数据作为test data,才能不会在train和valid的过程中被已有数据所蒙蔽

Validation dataset

1、验证集越大,验证的可信度越大

2、统计学上,调整分类器后,当30个以上预测结果的正确性发生变化的话,这种变化是可信的,值得注意的,小于30是噪音

3、因此Validation dataset通常数据要大于30000个,在准确率变化高于0.1%时,认为分类器的performance变化

4、但这样需要的数据往往偏多,所以可以尝试交叉验证(cross validation),交叉验证有个缺点是速度慢

Github地址:https://github.com/ahangchen/GDLnotes

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-09-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏fangyangcoder

tensorflow笔记(三)之 tensorboard的使用

http://www.cnblogs.com/fydeblog/p/7429344.html

945
来自专栏C#

开源免费的.NET图像即时处理的组件ImageProcessor

   承接以前的组件系列,这个组件系列旨在介绍.NET相关的组件,让大家可以在项目中有一个更好的选择,社区对于第三方插件的介绍还是比较少的,很多博文的内容主要还...

720
来自专栏企鹅号快讯

如何在Python中快速进行语料库搜索:近似最近邻算法

选自Medium 作者:Kevin Yang 机器之心编译 参与:路雪 最近,我一直在研究在 GloVe 词嵌入中做加减法。例如,我们可以把「king」的词嵌入...

1825
来自专栏机器人网

工业控制PID系统的十五个基本概念

PID调节系统PID功能由PID调节器或DCS系统内部功能程序模块实现,了解与PID调节相关的一些基本概念,有助于PID入门新手快速熟悉调节器应用,在自动调节系...

2646
来自专栏AI科技大本营的专栏

实战 | 手把手教你用苹果CoreML实现iPhone的目标识别

在WWDC 2017上,苹果首次公布了机器学习方面的动作。iOS系统早已支持Machine Learning 和 Computer Vision ,但这次苹果提...

5488
来自专栏Gaussic

OpenBr快速入门 原

这篇教程旨在使用一些有趣的例子让你熟悉OpenBR背后的思想、对象以及动机。注意需要摄像头的支持。

851
来自专栏TensorFlow从0到N

TensorFlow从0到1 - 17 - Step By Step上手TensorBoard

上一篇16 L2正则化对抗“过拟合”提到,为了检测训练过程中发生的过拟合,需要记录每次迭代(甚至每次step)模型在训练集和验证集上的识别精度。其实,为了能更...

3538
来自专栏机器之心

业界 | 谷歌正式发布TensorFlow 1.5:终于支持CUDA 9和cuDNN 7

3286
来自专栏数据库

数据挖掘专题四

接着上一期,我们找到差异基因以后,我们希望找到这些差异基因的功能,看它富集在哪些功能上,我们就可以做一下GO的富集分析。 一般GO(Gene oncology)...

1897
来自专栏AI科技大本营的专栏

TensorFlow 1.8.0正式发布,Bug修复和改进内容都在这里了

【导语】TensorFlow 1.8.0 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其编译如下。 ▌主要特点及改进 可以将 tf.contrib...

3249

扫码关注云+社区