TensorFlow深度学习笔记 逻辑回归 实践篇

Practical Aspects of Learning

转载请注明作者:梦里风林
Github工程地址:https://github.com/ahangchen/GDLnotes
欢迎star,有问题可以到Issue区讨论
官方教程地址
视频/字幕下载

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

Install Ipython NoteBook

可以参考这个教程

  • 可以直接安装anaconda,里面包含了各种库,也包含了ipython;
  • 推荐使用python2的版本,因为很多lib只支持python2,而且python3在升级中,支持3.4还是3.5是个很纠结的问题。
  • 安装anaconda后直接在终端输入 ipython notebook,则会运行一个ipython的server端,同时在你的浏览器中打开基于你终端目录的一个页面:


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


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

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

Install TensorFlow

安装教程就在TensorFlow的github页上>>>点击查看

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

  1. pip: 安装在全局的python解释器中,简单
  2. Third party: Virtualenv, Anaconda and Docker:都能创建tensorflow独立的编译环境,但就是多了一份包
  3. Source: 能够适应不同的python版本(比如编译一个3.5版的),但源码编译可能有许多坑
  • ubuntu安装时,需要注意自己的python - pip - tensorflow版本是否对应(比如是否都是2.7),

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

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

    • 安装anaconda2
    • 确定自己终端的pip和python版本:
      $ pip -V && python -V
    

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

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

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

    • 使用anaconda创建一个tensorflow虚拟环境:
      $ conda create -n tensorflow python=2.7
    
    • 切换到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
    

    注意如果安装的是gpu版本,还需要按照官网说明安装cuda和cudaCNN

    • 安装成功后就可以在tensorflow的python环境下,执行import tensorflow看看了。

notMNIST

修改的MNIST,不够干净,更接近真实数据,比MNIST任务更困难。

Todo

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

  • 下载

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

    代码示例:load_data.py

  • 解压

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

    代码示例:extract.py

  • 读图 - 展示 - 序列化

    • 用ndimage读取一部分图片,用pickle将读取到的对象(ndarray对象的list)序列化存储到磁盘
    • 用matplotlib.plot.imshow实现图片显示,可以展示任意的numpy.ndarray,详见show_imgs(dataset)
    • 这里展示的是二值化图片,可以设置显示为灰度图
    • 将每个class对应的图像数据集序列化到磁盘

    代码示例:img_pickle.py

  • 整理数据集

    • 用pickle读取pickle文件,
    • 从train_folder中为10个class分别获取10000个valid_dataset和20000个train_dataset,
    • 其中对每个class读取到的数据,用random.shuffle将数据乱序化
    • 将各个class及其对应的label序列化到磁盘,分别为训练器和校验集
    • 从test_folder中为10个class分别获取10000个test_dataset,
    • 其中对每个class读取到的数据,用random.shuffle将数据乱序化
    • 将各个class及其对应的label序列化到磁盘,作为测试集

    代码示例merge_prune.py

  • 去除重复数据

    • load_pickle,加载dataset

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

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

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

    • 示例代码即为clean_overlap.py中的imgs_idx_except

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

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

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

    • 示例代码即为clean_overlap.py中的imgs_idx_hash_except

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

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

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

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

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

    代码示例: clean_overlap.py

  • 训练一个logistics 模型

    • 将train_dataset作为输入,用valid_dataset进行验证(预测成功率82.5%)
    • 为了重复利用训练后的分类器,将其序列化到磁盘

    代码示例: logistic_train.py

  • Measure Performance

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

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

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

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

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

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

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

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

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

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

  • Validation dataset

    • 验证集越大,验证的可信度越大
    • 统计学上,调整分类器后,当30个以上预测结果的正确性发生变化的话,这种变化是可信的,值得注意的,小于30是噪音
    • 因此Validation dataset通常数据要大于30000个,在准确率变化高于0.1%时,认为分类器的performance变化
    • 但这样需要的数据往往偏多,所以可以尝试交叉验证(cross validation),交叉验证有个缺点是速度慢

觉得我的文章对您有帮助的话,点击这里给个star吧
(程序员一定要有一个Github账号啊!)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容