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

来源:互联网 发布:windows 10可以投屏吗 编辑:程序博客网 时间:2024/06/06 13:08

本文作者是一位教授深度学习的老师。传授深度学习知识既是他养家糊口的职业(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

其它资料

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

  • 入门级

    • The Unreasonable Effectiveness of Recurrent Neural Networks
    • How convolutional neural networks see the world - Keras Blog
    • What convolutional neural networks look at when they see nudity – Clarifai Blog
    • Convolutional neural networks for artistic style transfer
    • Dreams, Drugs and ConvNets,作者制作的幻灯片,他真考虑将其改写为一篇文章
  • 进阶级

    • Yes you should understand backprop
    • Transfer Learning using Keras
    • Generative Adversarial Networks (GANs) in 50 lines of code (PyTorch)
    • Minimal and Clean Reinforcement Learning Examples
    • An overview of gradient descent optimization algorithms
    • Picking an optimizer for Style Transfer
    • https://medium.com/slavv/picking-an-optimizer-for-style-transfer-86e7b8cba84b
    • Understanding LSTM Networks
    • Recurrent Neural Networks & LSTMs
    • Oxford Deep NLP 2017 course
  • 资源列表

    • How to Start Learning Deep Learning
    • A Guide to Deep Learning by YN^2
  • 更新资讯

    • r/MachineLearning,Reddit频道,经常介绍新事物
    • distill.pub,机器学习研究的交流期刊,收录大量论文
    • pinboard.in/u:pmigdal/t:deep-learning
    • @fastml_extra作者推荐的推特账号
    • GitXiv,找论文和代码的好地方
  • 数据集

    • Kaggle
    • AF Classification from a short single lead ECG recording: the PhysioNet/Computing in Cardiology Challenge 2017
    • [iNaturalist 2017 Competition](iNaturalist 2017 Competition),包括5000个种类的67.5万张图片
原文引自:http://geek.csdn.net/news/detail/197439?utm_source=tuicool&utm_medium=referral





0 0