专栏名称: 雷克世界
赛迪研究院(CCID)主办的新媒体平台,每天跟你聊聊机器人、人工智能、智能制造领域的那些你想知道的事……
目录
相关文章推荐
51好读  ›  专栏  ›  雷克世界

基于Keras的Deep Learning学习入门指南

雷克世界  · 公众号  · 机器人  · 2017-07-02 20:01

正文


「机器人圈」导览:关于深度学习(Deep Learning)现如今在AI领域有着举足轻重的地位,而怎样才能学好深度学习呢?拥有量子物理博士学位的Piotr Migdał是一个数据科学自由职业者,他积极参与有天赋的教育,发展量子游戏,并在deepsense.io上担任数据科学讲师,他对于深度学习有着不一般的教学经验,下面就和机器人圈一起来学习一下吧。


人们做一件事情,往往带有一定的目的性,对于深度学习,无论你开始着手的初衷是想开启一段职业生涯,还是仅仅是想进行一次探险(例如,检测可疑的对象),或者是想在机器接管世界之前先对它们有一个了解(just a joke),可以说你都可以在这篇文章中找到你想要的答案。本文的目标不在于神经网络教学本身,而是提供一个概述,并指出其中有用的资源。


不要害怕人工神经网络——它是很容易启动的!如果真要开始学习的话,所有你需要具备的就是真正的基本编程,非常简单的数学知识和几个机器学习概念的知识。接下来,我将一一解释该如何从这些要求中着手。


在我看来,最好的方法是从高级互动方式(另见:《高中生量子力学教材《Quantum Game with Photons。因此,我建议从Keras的图像识别任务开始进行,这是一个普遍的Python神经网络库。当然,如果你想要用比Keras更少的代码来训练神经网络,唯一可行的选择就是使用鸽子(pigeons)。是的,我是认真的:鸽子识别癌症的水平可是要比肩人类科学家


什么是深度学习?为什么它如此炫酷?


深度学习是使用多层人工神经网络的机器学习技术的名称。人们常常会使用人工智能这个术语,但除非你想要听起来很科幻,否则它就是为那些目前被认为是“对机器而言过于困难”的问题预留的,一个不断快速发展的前沿领域。这是一个在过去几年中得以大爆发的领域,特别是在视觉识别任务(包括许多其他任务)中可以企及人类的准确度,参见:


电子前沿基金会的AI研究进展情况(Measuring the Progress of AI Research(2017)


与量子计算或核聚变不同,它是一种正在应用的技术,而不是未来的一些可能性。有一个经验法则:


一个正常人可以在1秒钟内完成的任何操作,现在我们都可以使用AI的自动化完成。-—吴恩达在推文中说道


有些人甚至更进一步,将这种说法外延到科学家领域像Google和Facebook这样的公司处于如今的领先地位并不奇怪。事实上,每隔几个月我就会被超出我期望的东西惊讶到,例如:


维基百科条目和LaTeX文章中所谈及的生成假莎士比亚式文章的循环神经网络(RNN)的不合理有效性


艺术风格迁移的神经算法 (视频!


实时获和重现


彩色图像着色


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


皮肤病学家对皮肤癌的分类以及其他医疗诊断工具


图像平移(pix2pix)——素描到照片


用机器器绘制猫,狗等动物的草图


这看起来像是一些巫术。如果你好奇什么是神经网络,请观看以下这一系列视频,从而得到系统的介绍:


Stephen Welch揭秘神经网络


J Alamma的神经网络基础的视觉和交互指南


这些技术都是缺乏数据的(data-hungry)。查看Higgs数据集上的逻辑回归,随机森林和深度学习的AUC分数曲线(数据点以百万为单位):



一般来说,即使有大量数据,深度学习也比其他技术更好,比如随机森林或增强树等树型。


让我们试一下!


我需要一些Skynet才能运行吗?当然不用——像其他的软件一样,你甚至可以在浏览器中进行:


TensorFlow Playground用于点分离,具有可视界面


ConvNetJS用于数字和图像识别


Keras.js演示—在浏览器中可视化和使用真实网络(例如ResNet-50)


或者,如果你想在Python中使用Keras,请参阅这个最小的示例—只是为了让你确信你可以在自己的电脑上使用它。


Python和机器学习


我提到基础Python和机器学习以此来作为一个要求。在对Python中的数据科学以及统计和机器学习的介绍部分,这些都涵盖在内。


对于Python而言,如果你已经拥有Anaconda distribution(涵盖大多数数据科学软件包),那么你唯一需要做的就是安装TensorFlowKeras


而在涉及机器学习的时候,在开始着手学习深度学习之前你并不需要学习许多技巧。尽管如此,如果可以用更简单的方法来解决给定的问题,那将是一个很好的实践,再好不过了。例如,随机森林通常可看作是一个锁匙(lockpick),在许多问题上都是开箱即用的。你需要了解的是我们为什么要进行训练,而后去测试分类器(以验证其预测能力)。想要得到它的要点,那就从这个基于树的美丽动画开始:


Stephanie Yee和Tony Chu的机器学习视觉介绍(Visual introduction to machine learning


此外,理解逻辑回归(logistic regression)也是一个不错的选择,要知道,逻辑回归几乎是任何神经网络分类的基础。


数学


深度学习(即具有多层次的神经网络)主要使用非常简单的数学运算。这里有几个示例,你可以在几乎任何网络中找到(只是看一看这个列表,请不要被吓到):


向量,矩阵,多维数组


加法,乘法


卷取提取和处理局部模式


激活函数:sigmoidtanh或添加非线性的reLU(ReLU to add non-linearity)


Softmax将向量转换为概率


对数损失(交叉熵)以智能方式惩罚错误的猜测(另见Kullback-Leibler发散解释


梯度和链规则(反向传播),用于优化网络参数


随机梯度下降及其变体(例如动量)。


如果你的专业背景是数学,统计学,物理学或信号处理的话——很有可能你已经知道了足够多的知识足以去开始学习!


而如果你与数学的最近一次接触还是在高中,那么也别担心。其实数学很简单,用于数字识别的卷积神经网络都可以在电子表格(没有macros)中实现,请参阅: Deep Spreadsheets with ExcelNet。这只是一个原则性的解决方案—不仅效率不高,而且还缺乏最关键的部分—训练新网络的能力。


矢向量运算的基础不仅对于深度学习至关重要,而且对许多其他机器学习技术也是至关重要的(例如在我写的word2vec中)。而想要了解它,我建议从以下之一开始:


J.Ström,K.Åström和T. Akenine-Möller著作的Immersive Linear Algebra  —一个具有完全交互式图形的线性代数书


应用数学和机器学习基础:深度学习书本中的线性代数


Brendan Fortuner著作的《深度学习线性代数作弊表


由于书中有很多地方引用到NumPy,那么学习它的基础知识想必是很有用的:


Nicolas P. Rougier著作的《从Python到Numpy 


SciPy课程:NumPy数组对象


同时,回想一下其中所蕴含的道理,就像数学家们所认为的那样。从魔术般的工作代码开始,处理像乐高积木这样的神经网络层是完全可以的。


架构


有几个深度学习库是非常受欢迎的,包括TensorFlow,TheanoTorchCaffe。他们每个都有Python接口(当然,现在Torch中也有:PyTorch)。


那么,我们该选择哪个呢?首先,像往常一样,把所有微妙的性能基准抛诸脑后,因为过早的优化是万恶之源。最重要的是从易于编写(和阅读)的那一个开始,从一个有许多在线资源,从一个可以安装在你的计算机上而不会出现过多BUG的那一个开始。


请记住,核心框架是具有GPU支持的多维数组表达式编译器。目前的神经网络可以这样表达。然而,如果你只是希望使用神经网络,通过最小功率规则,我建议从一个神经网络框架开始。例如……


Keras


如果你喜欢Python哲学(简洁,具有可读性,一种首选的做法),那么Keras就是为你量身定做的。它是使用TensorFlow或Theano作为其后端的神经网络的高级库。另外,如果你想有一个宣传画面,有可能会出现一个有偏差(或过度拟合)的排名:


深度学习框架状态(来自GitHub指标), 2017年4月。——弗朗索瓦•乔克(Keras创造者)


 

如果你想咨询不同的来源,基于arXiv文件而不是GitHub的活动,请参阅Andrej Karpathy的机器学习趋势。流行是很重要的,这意味着如果你想搜索一个网络架构,搜索它(例如UNet Keras)可能会返回一个示例。那么应该从哪里开始学习呢?关于Keras的文档很好,而且它的博客是一个有价值的资源。对于Jupyter笔记本中使用Keras深入学习的完整互动介绍,我真的推荐应该去看看:


由Valerio Maggio著作的基于Keras和TensorFlow的深度学习


如果你想要较为简短一些的,请尝试以下其中一项:


Erik Reppel著作的使用Keras和Cats可视化卷积神经网络的部分


PetarVeličković著作的完全初学者的深度学习:基于Keras的卷积神经网络


Jason Brownlee著作的在Python中使用复杂的神经网络的手写数字识别(Theano张量维度)


Keras有几个附件,这对于学习它来说尤其有用。我为顺序模型创建ASCII汇总,以显示网络内的数据流(比 model.summary()更好)。它显示层数,数据维数(x, y, channels) 和空闲参数数量(待优化)。例如,对于用于数字识别的网络,它可能如下所示:

  

     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


你可能也会对使用keras-tqdm的更好的进度条感兴趣,用quiver来探索每一层的激活函数,使用keras-vis来检测attention 映射或将Keras模型转换为JavaScript,并在Keras.js的浏览器中运行。说到语言,还有到Keras的R接口


TensorFlow


如果不是Keras,那么我建议从单一的TensorFlow开始。这是一个级别更低和更为冗长的工具,但是可以直接优化各种多维数组(还有张量)操作。如下展示一些好的资源:


官方的TensorFlow教程非常好


MartinGörner著作的学习TensorFlow和深度学习。


Aymeric Damien著作的为初学者提供TensorFlow教程和示例(使用Python 2.7)


Nathan Lintz著作的使用Google的TensorFlow框架的简单教程


无论如何,TensorBoard可以轻松追踪训练过程。它也可以通过回调与Keras一起使用。


其他


Theano与TensorFlow类似,但有点老了,更难开始着手。例如,你需要手动写入变量的更新。典型的神经网络层不包括在内,所以经常使用诸如Lasagne这样的库。如果你正在寻找一个开始的地方,我喜欢下面这个介绍:


Marek Rei著作的Theano教程

同时,如果你在Torch或PyTorch中看到一些不错的代码,不要害怕安装并运行它!


数据集


每个机器学习问题都需要数据。你不能只是告诉它“检测这张照片中是否有猫”,并期望电脑告诉你答案。你需要显示许多猫的实例,以及不包含猫的图片,并且(希望)它将学习将其概括为其他情况。所以,你需要一些数据才能开始。这不是机器学习或只是深度学习的缺点 —它是任何学习的基本属性!


在潜入未知的水域之前,不妨先看一些流行的数据集。其中它们最关键部分就是它们是非常受欢迎的。这意味着你可以找到很多例子。并保证这些问题可以用神经网络解决。


MNIST


许多好的想法在MNIST(例如批处理规范)上将无法正常工作。反之,许多坏主意也许可以在MNIST上工作,而不会转移到真正的[计算机视觉]上。

                                                       —François Chollet’s tweet


不过,我建议从包含在keras.datasets中的MNIST数字识别数据集(60k灰度28x28图像)开始。不需要掌握它,只是为了得到它的工作原理(或者测试本地机器上的Keras的基础知识)。


notMNIST


事实上,我曾经提出,AI工作者面临的最棘手的挑战是回答这个问题:“A”和“I”是什么? 

                                                ——Douglas R. Hofstadter(1995)


一个更有趣的数据集,对于经典机器学习算法来说更加困难,它是notMNIST(字母A - j来自奇怪的字体)。如果你想从它开始,这里是我的代码,它是在Keras中进行的notMNIST加载和逻辑回归。


CIFAR


如果你对图像识别感兴趣,则有CIFAR数据集,32x32照片的数据集(也可以在keras.datasets中)。它有两个版本:10个简单的课程(包括猫,狗,青蛙和飞机)和100个更难和更细微的课程(包括海狸,海豚,水獭,印章和鲸鱼)。我强烈建议从CIFAR-10开始,简单的版本。当心,更复杂的网络可能需要相当长的一段时间(在我7岁时在Macbook Pro的CPU上运行时间为12小时)。


更多


深度学习需要大量数据。如果要从头开始训练网络,即使是低分辨率(32x32),也可能需要多达10k左右的图像。特别是如果数据很少,就不能保证网络会学到任何东西。那么有什么办法可以解决这个问题呢?


使用非常低的分辨率(如果你的眼睛可以看到它,不需要使用更高的分辨率)


获得大量数据(对于像256x256这样的图像可能是:数百万个实例)


重新训练已经看到很多的网络


产生更多的数据(包括旋转、移位和变形)


通常,它是这是所提到的一切东西的组合。


站在巨人的肩膀上


创建新的神经网络与烹饪有很多共同之处—有典型的成分(层)和配方(流行的网络架构)。最重要的烹饪比赛是ImageNet大型视觉识别挑战赛,从50万个照片数据集中识别出数百个类。看看这些神经网络架构,通常使用224x224x3的输入(Eugenio Culurciello的图表):



圆的大小代表参数的数量(很多!)。不过,没有提到SqueezeNet,这种架构大大减少了参数的数量(例如减少了50倍)。


用于图像分类的几个关键网络可以从keras.applications模块轻松加载:Xception,VGG16,VGG19,ResNet50,InceptionV3。其他一些不是即插即用,但仍然很容易在网上找到—是的,在Keras有SqueezeNet。这些网络有两个目的:


它们提供了有用的构建块和架构


当使用具有预先训练权重的架构时,它们是重新训练(所谓的迁移学习)的最佳候选


图像的其他一些重要网络架构:


U-Net:生物医学图像分割的卷积网络


视网膜血管分割与卷积神经网络 -——基于Keras实现


利用Keras,为Kaggle的超声神经细分竞争提供深入的学习指导


一种艺术风格的神经算法


《在Keras中执行神经风格迁移和神经涂鸦》——Somshubra Majumdar


《CNN在图像分割中的简史:从R-CNN到Mask R-CNN》——Dhruv Parthasarathy

 

另一套见解:


《神经网络动物园》——Fjodor van Veen


如何训练你的深度神经网络——有多少层,参数等


基础


对于非常小的问题(例如MNIST,notMNIST),你可以使用个人计算机—即使它是笔记本电脑,计算也是在CPU上进行的。


对于小问题(例如,CIFAR,不合理的RNN),你仍然可以使用PC,但需要更多的耐心和权衡。


对于中等和较大的问题,基本上唯一的办法是使用具有强大图形处理器(GPU)的机器。例如,我们花了2天时间来训练一个卫星图像处理的模型来进行Kaggle的竞赛,请参阅:


ArkadiuszNowaczyński的基于图像分割的卫星图像深度学习


在一个强大的CPU上,将需要花费几周的时间,请看:


Justin Johnson的流行卷积神经网络模型的基准


使用强大GPU的最简单和最便宜的方法是每小时租一台远程机器。你可以使用亚马逊(它不仅是一个书店!),这里有一些指导:


亚马逊EC2上的Keras与GPU—一个循序渐进的指导,由Mateusz Sieniawski,我的学员完成


在AWS上的GPU上运行Jupyter笔记本电脑:Francois Chollet的入门指南


进一步学习


我鼓励你与代码之间进行交互。例如,notMNIST或CIFAR-10可以是很好的起点。有时,最好的开始是从别人的代码开始运行,然后查看修改参数时会发生什么。


为了学习如何运作,这一个是杰作:


由Andrej Karpathy编写的CS231n:卷积神经网络的视觉识别演讲视频


对于书籍来说,有一个很好的例子,从介绍数学和机器学习的学习环境开始(甚至以我喜欢的方式涵盖对数丢失和熵)!)


《深度学习》,麻省理工学院出版社的,这是由Ian Goodfellow,Yoshua Bengio和Aaron Courville联合编辑的。


或者,你可以使用(它可能有利于交互式材料的介绍,但我发现风格有点长):


Michael Nielsen著作的《神经网络与深度学习》


其他材料


有很多深度学习的应用(不仅仅是图像识别!)。我收集了一些介绍材料来涵盖其各个方面(请注意:它们有各种困难)。不要尝试将它们全部阅读 ——我把它们列为灵感,而不是恐吓!


通读性:


《循环神经网络的不合理有效性》——Andrej Karpathy


《卷积神经网络如何看待世界 》——Keras Blog


《What convolutional neural networks look at when they see nudity》——Clarifai博客(NSFW)


《用于艺术风格迁移的卷积神经网络》——Harish Nrayanan


《梦幻、药物和康复》——我的幻灯片(NSFW),我正在考虑把它变成一个更长的帖子——基于常识错误下的机器学习VS人类学习。


技术性:


《Yes you should understand backprop》——Andrej Karpathy 


《基于Keras的迁移学习》——Prakash Vanapalli


《50行代码中的生成对抗网络(GAN)》(PyTorch)


《Minimal and Clean Reinforcement Learning Examples》


《梯度下降优化算法概述》——Sebastian Ruder


《风格迁移的优化选择》——Slav Ivanov


《在Keras建造自动编码器》——Francois Chollet


《理解长短期记忆网络模型(LSTM)》——Chris Olah


《RNN&LSTMs》——Rohan Kapur


牛津深度自然语言处理2017课程


资源清单


《如何开始学习深度学习》——Ofir Press


《深度学习指南》——YN ^ 2


最流行的:


r / MachineLearning Reddit频道涵盖大部分最新内容


distill.pub—一种用于机器学习研究的交互式、视觉的、开放的期刊,并附有说明文章


我的链接在pinboard.in/u:pmigdal/t:deep-learning——虽然只能保存,而不是自动推荐


@fastml_extra Twitter频道


GitXiv——提供论文及代码


不要害怕阅读学术论文。有些文章写得很好,有着深刻的见解(如果你有Kindle或其他电子书阅读器,我推荐Dontprint)。


数据(通常是具有挑战性的)


Kaggle


从单次导联心电图记录中的AF分类: 2017年心理学挑战中的PhysioNet /计算


2017 iNaturalist竞赛(675k图像和5k物种),vide Mushroom AI


希望这篇文章可以使你对深度学习有一个更为深入的了解。


来源:Piotr Migdał - blog

作者:Piotr Migdał  


欢迎加入


中国人工智能产业创新联盟在京成立 近200家成员单位共推AI发展



关注“机器人圈”后不要忘记置顶

我们还在搜狐新闻、机器人产业网、腾讯新闻、网易新闻、一点资讯、天天快报、今日头条、QQ公众号…

↓↓↓点击阅读原文查看中国人工智能产业创新联盟手册

推荐文章
悦读文摘  ·  什么才是真正的人脉?
7 年前
人像摄影  ·  实例打造花样新娘(续)
7 年前