你好,游客 登录
背景:
阅读新闻

如何通过Keras来掌握深度学习

[日期:2017-05-14] 来源:CSDN  作者: [字体: ]

  本文作者是一位教授深度学习的老师。传授深度学习知识既是他养家糊口的职业(Kaggle比赛获胜队伍的教练),也是他在波兰儿童基金会志愿者工作的一部分。因此,他打算和我们分享一些学习和教授深度学习知识时的心得。本文并不会具体讲解某个神经网络模型,而是总览性的介绍。

  

 

  首先,不要害怕接触神经网络模型,入门真的很容易!作者当初害怕难学,现在后悔学晚了。我们只要具备最基本的编程知识、简单的数学知识和机器学习概念就可以上手。作者接下来就会介绍如何上手学习。

  在他看来,最好的学习方法是从高层次的互动方式切入,因此,他建议学习Keras的图像识别任务,这是Python环境下的一个通用神经网络库,只需几行代码就够。若是想再缩减代码量,唯一的方法就是用鸽子。没错,认真脸:鸽子诊断癌症的水平堪比人类专家

  深度学习是什么?

  深度学习是机器学习技术之一,采用多层神经网络模型。近些年来人们在此领域开展了大量的探索,在视觉识别等领域准确率已经达到人类的水平。不像量子计算、核聚变等,这项技术当前正应用于实际产品中,而不是凭空画大饼。大牛曾经说过:

  大多数正常人能在一秒之内完成的任务,现在都能由人工智能来完成。—— 摘自[吴恩达的推特](https://twitter.com/andrewyng/status/788548053745569792)

  Google和Facebook等公司一直处于技术前沿并不令人感到惊讶。事实上,作者表示每个几个月他都会被某些超出自己期望的技术所征服,比如:

  循环神经网络的神器效果用于模仿生成莎士比亚作品、维基百科词条和LaTeX文章

  一种艺术形式迁移的神经算法

  实时人脸捕捉和重现

  彩色图像彩色化

  用于真实感图像生成的即插即用生成网络

  基于其它医疗诊断技术的专家级皮肤癌分类

  图片到图片的翻译

  教授机器学画猫、狗等动物的简笔画

  看起来似乎像是一件件魔法。如果大家对神经网络模型感兴趣,可以观看系列入门教程的视频:

  Stephen Welch的神经网络模型解密

  J Alammar的神经网络基础指导

  这些算法往往需要海量训练数据。下图是逻辑回归、随机森林和深度学习三种方法在Higgs数据集上的AUC分数(横坐标的单位是百万):

  

 

  一般来说,我们并不能保证深度学习的效果比其它方法好,比如随机森林或者决策树,即使在数据量足够大的情况下。

  开始实践

  是否需要Skynet之类的神器帮助运行呢?显然不必,甚至可以在浏览器内运行代码:

  TensorFlow Playground提供可视化界面的样本分类

  ConvNetJS用于数字和图像识别

  Keras.js Demo在浏览器中可视化展现和使用网络模型

  如果想要在Python环境中使用Keras,参考这个小示例。

  Python和机器学习

  作者之前提到过Python和机器学习是必备的基础知识。相关的教程可以分别参考作者曾经的文章《基于Python的数据科学介绍》以及《统计与机器学习》。

  对于Python,如果大家的电脑里已经安装了Anaconda环境,只需再安装TensorFlow和Keras。

  至于机器学习,在入坑深度学习之前并不需要掌握太多的相关知识。当然,之后在实践中可以分析某个问题是否能够采取更简单的方法。比如,随机森林算法就是万能钥匙,适用于大部分问题。大家需要理解我们为什么要训练模型,然后测试它的效果。可以参考下面的教程:

  Stephanie Yee和Tony Chu的《机器学习的可视化介绍》

  数学知识

  深度学习模型中用到的数学知识还算是比较基础。下面罗列了一些,这些知识在其它网络模型里也很常见:

  向量、矩阵和多维数组;

  加法和乘法;

  卷积运算提取局部特征;

  激活函数:sigmoid, tanh或者ReLU等;

  softmax将向量转化为概率值;

  log-loss(cross-entropy)作为惩罚项

  网络参数优化的梯度反向传播算法

  随机梯度下降及其变种(比如冲量)

  如果大家的学科背景是数学、统计学、物理或者信号处理,那应该绰绰有余了。如果只有高中数学的基础,也别慌。用于识别数字的卷计算机网络也可以仅用Excel表格实现:Deep Spreadsheets with ExcelNet。

  向量计算是深度学习和其它机器学习算法的基本内容(比如,作者曾经介绍过word2vec的文章)。作者建议大家参考下面几份学习资料:

  J. Ström, K. Åström, 和 T. Akenine-Möller 编写的《Immersive Linear Algebra》

  应用数学和机器学习基础:《深度学习》的线性代数章节

  Brendan Fortuner 的《Linear algebra cheat sheet for deep learning 》

  以及Numpy相关的一些基础知识:

  Nicolas P. Rougier 的《From Python to Numpy》

  《SciPy lectures: The NumPy array object》

  框架

  目前,市面上有很多流行的深度学习库,包括Tensorflow、Theano、Torch和Caffe。它们都提供了Python接口(Torch也开放了Python接口:PyTorch)

  我们该如何选择呢?作者建议,首先在标准测试集上跑一遍各个方法的效果,因为过早的优化是万恶之源。最明智的做法是选一个容易开发、在线文档齐全而且安装方便的工具。

  Keras

  如果大家信奉Python的哲学(简洁、易读),Keras正合你意。它属于神经网络的上层封装库,对Tensorflow和Theano做了封装。下图是大家较为认可的各个工具排名:

  深度学习框架概览,2017年4月,Keras创作者Francois Chollet根据Github评分制作

  

 

  除了Github的活跃度,也可以参考根据arXiv论文得到的排名,参见by Andrej Karpathy的报告《机器学习趋势一瞥》。工具的流行程度越高,意味着如果你遇到了问题,在Google搜索得到答案的机会也越大。Keras的学习文档非常友善,它的官方博客也提供了宝贵的资源。为了全面了解在 jupyter notebook 环境下使用 Keras,作者强烈建议阅读:

  Valerio Maggio的《基于Keras和Tensorflow的深度学习》

  这里也有几篇篇幅较短的文章:

  Erik Reppel写的基于Keras 和 Cats 的卷计算机网络可视化

  Petar Veličković 写的深度学习完全入门:基于Keras的卷计算机网络

  Jason Brownlee写的用Keras和卷计算机网络识别手写数字

  另外,作者还开发了许多非常实用的Keras插件。比如查看序列模型网络内部数据流的ASCII summary,比model.summary()用起来更方便。它可以显示层级、数据维度以及待优化的参数数量。例如,一个数字识别网络是这样的:

  OPERATION DATA DIMENSIONS WEIGHTS(N) WEIGHTS(%)

  Input ##### 32 32 3

  Conv2D \|/ ------------------- 896 0.1%

  relu ##### 32 32 32

  Conv2D \|/ ------------------- 9248 0.7%

  relu ##### 30 30 32

  MaxPooling2D Y max ------------------- 0 0.0%

  ##### 15 15 32

  Dropout | || ------------------- 0 0.0%

  ##### 15 15 32

  Conv2D \|/ ------------------- 18496 1.5%

  relu ##### 15 15 64

  Conv2D \|/ ------------------- 36928 3.0%

  relu ##### 13 13 64

  MaxPooling2D Y max ------------------- 0 0.0%

  ##### 6 6 64

  Dropout | || ------------------- 0 0.0%

  ##### 6 6 64

  Flatten ||||| ------------------- 0 0.0%

  ##### 2304

  Dense XXXXX ------------------- 1180160 94.3%

  relu ##### 512

  Dropout | || ------------------- 0 0.0%

  ##### 512

  Dense XXXXX ------------------- 5130 0.4%

  softmax ##### 10

  Tensorflow

  如果不用Keras,作者则建议只用Tensorflow。它比Keras更底层、更灵活,能直接对各个多维数组参数做优化。下面也是作者推荐的一些相关资源:

  官方教程Tensorflow Tutorial非常不错

  Martin Görner 的《不读博士也能学习Tensorflow和深度学习》

  Aymeric Damien 写的《Tensorflow入门教程和示例》

  Nathan Lintz 写的《Tensorflow框架简单教程》

  另外,TensorBoard是一款在训练过程中调试和查看数据非常方便的工具。

  其它

  Theano与Tensorflow很相似,但是更早出现,略微难以上手。比如,大家需要自己动手写变量更新的代码。不提供典型的神经网络层级,往往还需要再调用lasagne包。作者也推荐了入门教程:

  Marek Rei编写的Theano教程

  数据集

  解决每个机器学习问题都离不开数据。我们没办法告诉计算机“检测图片中是否有猫”这个命令,希望计算机直接给我们答案。而是要提供大量含有猫和不含有猫的图片,然后让计算机从这些数据中学习。因此,我们手头必须要先有一份数据集。这并不是机器学习或是深度学习的短板,任何的学习方法都离不开数据!

  作者推荐了几个常用的数据集。它们的共同点就是……常用!这就意味着大家很容易在网上找到可以运行的示例,并且前人已经留下了大量的经验。

  MNIST

  很多好的想法在MNIST数据集上并不管用(比如batch norm)。相反,很多糟糕的想法对MNIST有效,但是却无法迁移到实际问题中。—— 摘自[François Chollet 的推特](https://twitter.com/fchollet/status/852594987527045120)

  MNIST是一份手写数字识别数据集(60000张28x28的灰度图)。它适合用来测试本机上安装的Keras是否成功。

  notMNIST

  其实,我曾经说过,AI研究者面临的最难回答的问题就是“字母A和I是什么?” —— [Douglas R. Hofstadter](https://web.stanford.edu/group/SHR/4-2/text/hofstadter.html)(1995年)

  另一个更有趣、相对经典机器学习算法也更难解决的数据集是notMNIST(异形字体的字母A-J)。这里提供了Keras加载和用逻辑回归预测notMNIST的代码。

  CIFAR

  CIFAR是经典的图像识别数据集,都是32x32尺寸的照片。它分为两种版本:10类简单的照片(包括猫、狗、青蛙、飞机等)和100类更难的照片(包括海狸、海豚、水獭、海豹、鲸鱼等)。作者建议先从简单的10类照片开始学习,因为训练复杂的模型往往要耗费大量的时间(作者用了7年的MacBook Pro需要跑12个小时)。

  其它数据集

  深度学习算法都需要大量的数据。如果大家想从头开始训练网络模型,至少需要大约10000张低分辨率的图片。当数训练据匮乏时,网络模型很可能学不到任何模式。那么该怎么办呢?

  只要肉眼看得清,使用低分辨率的图像也无妨

  尽可能多的收集训练数据,最好达到百万级别

  在已有的模型基础上开始训练

  用现有数据集构造更多的训练数据(比如旋转、平移和扭曲)

  站在巨人的肩膀上

  训练神经网络模型就如同烹饪,原料(网络层)和菜谱(通用网络结构)都有固定的搭配。最具有影响力的烹饪大赛就是ImageNet Large Scale Visual Recognition Challenge,用50万张照片训练模型来识别几百类问题。这里介绍了一些神经网络结构,输入数据基本都是224x224x3的图片:

  

 

  圆形的大小代表参数的数量。图中没有提到SqueezeNet,这个网络结构极大地压缩了模型参数(减少约50倍)。

  一些主要的图像分类模型可以直接从keras.applications模块加载使用,比如Xception, VGG16, VGG19, ResNet50, InceptionV3。另外一些模型尽管不能直接加载,但是也可以很方便的在网上找到。这些网络模型有两大作用:

  给我们搭建新的网络模型提供了参考

  便于大家在其基础上继续训练模型(也被称为迁移学习)

  作者列举了图像领域的几种其它的网络结构:

  U-Net:用卷计神经网络对生物医学图像进行分割

  卷积神经网络提取视网膜血管,Keras实现

  Kaggle超声神经提取比赛的深度学习教程 ,Keras实现

  一种艺术风格的神经算法

  神经网络实现风格转换和涂鸦,作者是Somshubra Majumdar

  图像分割领域的CNN进化史:从 R-CNN 到蒙板 R-CNN,作者是Dhruv Parthasarathy

  硬件设施

  对于超小规模问题(比如MNIST和notMNIST),个人电脑就能训练数据,甚至笔记本电脑也能完成。

  对于普通小规模的问题(比如CIFAR),PC机应该还是能扛得住,但是需要耐心地等待训练过程。

  对于中等规模或是大规模的问题,基本上要依赖装有GPU的大型机器。例如,作者他们花了整整两天的时间来训练Kaggle比赛的卫星照片数据:

  Deep learning for satellite imagery via image segmentation,作者Arkadiusz Nowaczyński

  若用高端CPU机器训练,需要若干星期的时间:

  Benchmarks for popular convolutional neural network models,作者Justin Johnson

  然而,最简单划算的利用GPU途径就是按使用时长向平台租用机器。比如使用亚马逊云,作者也提供了一部分使用指南:

  Keras with GPU on Amazon EC2 – a step-by-step instruction,作者Mateusz Sieniawski

  Running Jupyter notebooks on GPU on AWS: a starter guide,作者Francois Chollet

  拓展学习

  作者鼓励大家多动手写代码。举个例子,notMNIST 和 CIFAR-10 就非常适合初学者练习。有时候,参考别人的代码并做修改,然后观察输出结果的变化,也不失为是一条学习的捷径。

  神经网络学习课程:

  CS231n: Convolutional Neural Networks for Visual Recognition,Andrej Karpathy教授开课

  经典教材推荐:

  Goodfellow, Yoshua Bengio 和 Aaron Courville等几位大牛联合编写的Deep Learning, An MIT Press book

  以及 Michael Nielsen 编写的Neural Networks and Deep Learning

  其它资料

  深度学习的应用产品多种多样,作者从各个不同的角度收集整理了入门级的材料。作者强调,别想着把它们都读完,他只是想给大家多一点启发,不是为了显摆!

推荐 打印 | 录入: | 阅读:
相关新闻      
本文评论   
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款