[深度学习]七行代码体验深度学习的神奇

Posted yofer张耀琦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[深度学习]七行代码体验深度学习的神奇相关的知识,希望对你有一定的参考价值。

简介

这是深度学习系列的第一节,这个课程是为了让深度学习更能为大众接受,为了那些在机器学习和数学方面没有很深厚背景的同学设计。我们强烈相信深度学习将在很多领域产生变革;比如,这个课程的对象是有计算机编程背景的同学以及想在他们专业领域引用这些技术的人。

这节课的最后,我们将理解如何仅用七行代码写出有使用意义的深度学习技术。

为什么现在要学习深度学习技术?

由于下面3个关键原因,深度学习现在变得越来越重要:

  • 无限可变的方程:驱动深度学习进展的方程是神经网络,它实际上是通用逼近机。具体而言,通用逼近理论告诉我们,这个函数能够处理我们应用的任何问题。
  • 参数拟合:通过梯度下降和反向传播,我们能够拟合任何给定训练集的参数。使得我们可以近似理论方程,这个方程允许我们做任何事情,并应用它。
  • 速度和可拓展性:深度学习依赖于矩阵操作来实现计算成本昂贵的结果。图形处理单元(GPU)是经过优化的处理器,可以执行计算机图形和图像处理等计算。幸运的是,游戏产业的发展导致了廉价和强大的GPU。

由于这些原因,现在任何人都可以以既经济又快速的方式将深度学习技术应用于实际问题。

深度学习的成长

Jeff Dean最近的一次演讲突显了Google在深度学习方面的大幅增长。正如我们所看到的,Google的深度学习项目在过去的几年里呈现爆炸式的增长,几乎所有应用中都有应用。我们相信,任何组织都可能实现相似的增长,不仅仅是科技巨头。

我们已经可以看到业余爱好者如何轻松地将深度学习应用于各种有影响力的应用:

  • 皮肤损伤的分类:使用一个预训练的CNN网络,和我们这节课用到的非常相似,这个小组创建了一个模型,可以以60%的准确率分类皮肤损伤,和之前15.6%的基准相比,提升了4倍。这是一个巨大的进步。
  • 植物疾病的分类:这组工业工程师能够成功将健康的叶子与有13种其他疾病的叶子区分开。
  • 无线电调制分类:一组电子和计算机工程师使用深度学习来识别无线电调制。他们的结果表明,有可能使传感系统的有效覆盖面积增加一倍,我们看到深度学习产生的巨大影响。
  • 心脏症状诊断:两位对冲基金分析师能够建立一个能像医生一样准确诊断心脏状况的模型。这是非常惊人的。
  • 衣服分类:这个小组成功建立一个模型,可以识别衣服的物品,以及它们的种类。

这只是冰山一角。像病变分类和心脏诊断这样的应用程序在整个发展中国家有很大的潜力来彻底改变医疗保健。再次强调,任何具有计算机编程背景的人都可以学习如何完成类似的事情,而不必成为该领域的专家。我们的目标是教你如何做到这一点,希望我们能够将深度学习的影响扩大到所有领域。

准备工作

GPU访问

为了这个课程的进行,你需要一个能够适用于深度学习的GPU。幸运的是,亚马逊网络服务(AWS)现在有NVIDIA GPU的实例可以使用。或者对于基础网络,也可以使用个人电脑的CPU进行运算,当然运算速度相比会很慢。

必要文件

参阅github wiki page,了解如何从我们的github仓库获取必要的文件。主要是utils.py等配置文件需要提前下载好。

然后,需要下载将用来训练和测试我们的模型的数据集。在本课中,先来看看Dogs vs. Cats,Kaggle的比赛,要求用户分类猫和狗的图像。当时的工艺水平,准确率可以达到80%。我们将很快看到如何建立一个精度达到97%的简单模型。

在下载数据之前,在名为data的 nbs中创建一个子目录。 然后将dogscats.zip下载到该目录并解压缩。

数据结构

需要注意的是这些数据的结构,因为我们使用的深度学习模型的实现将依赖它。

构建机器学习模型的标准做法是将我们的数据分成以下子集:

  • 训练集:这是我们的算法将用来拟合参数以进行预测的数据
  • 验证集:我们用来微调(fine tuning)参数的数据
  • 测试集:我们用来测试我们的最终模型的数据。 由于这个数据以前没有被模型看到过,所以它的目的是模拟它将如何执行新的数据。

对DogsCats目录的快速浏览可以看到:测试,训练和验证集在不同的子目录中。在这些目录下面还有子目录,cats and dogs,分别包含每个类别的数据。注意,每个狗和猫图像被标记为了狗或猫。也可以看到,我们的测试数据是没有标签的,正如我们所期望的那样。

注意这些结构是很重要的,因为将要使用的深度学习实现,希望数据目录遵循这些约定。具体来说,它将根据训练和验证目录下的子目录的数量,知道要训练多少个类别。尝试将此模型应用于其他数据集时,请务必遵循这些约定。

注意到另一个名为sample的目录。训练和验证整个数据集可能需要一些时间。因此,在调整实现时,可以在训练和验证数据的小样本上运行算法,这是很好的技巧。这样做,可以立即得到结果,直到满意为止,并准备在整个数据集上构建模型。

使用卷积神经网络

在第一课中,我们将了解 允许计算机“看”的卷积神经网络(CNN)。

介绍本周的任务:’Dogs vs. Cats’

我们将尝试创建一个模型来进入Kaggle的Dogs vs Cats比赛。现在有25,000张贴有标签狗和猫的照片可供训练,还有12500张照片需要在本次比赛中进行标注。根据Kaggle的网站,当这个比赛在2013年底开始时:“现有技术水平:目前的文献表明机器分类器在这个任务上的准确率可以达到80%以上”。 所以如果我们能够击败80%,那么我们将在2013年处于领先地位!

基本设置

这里用到notebook来运行代码,对于Notebook的使用可以查看教程:
Jupyter Notebook教程 in Python

在开始运行model之前,需要先进行配置和导入必要的包,第一步是运行

%matplotlib inline

这是为了确保plot可以显示在notebook中。

再次推荐使用notebook,因为它可以保存下你操作的所有中间过程,方便后续查看。注意在第一次使用anaconda,导入深度学习工具utils.py的时候,会不断提示缺少各种库,缺哪个,用anaconda下载安装即可,非常方便。

下面定义path,在sample数据和完整数据上可以切换

#path = "data/dogscats/"
path = "data/dogscats/sample/"

接着导入下面几个库:

from __future__ import division,print_function
import os, json
from glob import glob
import numpy as np
np.set_printoptions(precision=4, linewidth=100)
from matplotlib import pyplot as plt
import utils; reload(utils)
from utils import plots

之前已经下载了utils.py,里面封装了一些我们常用的函数。

如果在库里面做了任何改动,reload(utils)将会更新notebook。

下面就可以开始查看model了

使用一个预训练的VGG 模型和我们的Vgg16类

第一步是一个预先被创建好的,使用非常便利的model,可以识别各种图像(1000中类别)。我们将使用’VGG’,赢得2014年的图像比赛,这个模型创建和理解都非常简单。

VGG ImageNet团队创建了一个更大的,更慢,更精确的模型(VGG19)和一个更小,更快的模型(VGG16)。我们将使用VGG16,由于VGG19的性能较慢,只是为了较小精度的提升并不值得。这里创建了一个python类,Vgg16,可以直接使用VGG16模型。

要理解Vgg16是建立在数据上的,这很重要,查看下面的图像,可以看到大多数的图像都是单个物体,这意味着Vgg16对于图像是一个对象的情况最合适,比如我们的猫和狗的图像。当使用预训练模型,探讨它被训练时的数据是有必要的,你可以理解它的局限和偏差。

http://wx3.sinaimg.cn/mw690/a9c4d5f6gy1fncsjk7jz8j20t20lahdt.jpg” alt=”” title=”” />

重点:7行代码中最先进的自定义模型。

理解了Vgg16是什么,是基于什么训练的,下面就来看看用七行代码建立一个最先进的模型,在Cats vs. Dogs datset中精确度超过97%。

# 尽可能的打,但不建议超过64
# 如果你的GPU比较老或者便宜,跑起来会提示耗尽内存,然后就减小batch_size
batch_size=64
# 导入类和实例
from vgg16 import Vgg16
vgg = Vgg16()

# 每次抓取一些图像来训练和验证
# 注:他们子目录的命名必须基于他们的类别
batches = vgg.get_batches(path+'train', batch_size=batch_size)
val_batches = vgg.get_batches(path+'valid', batch_size=batch_size*2)

vgg.finetune(batches)
vgg.fit(batches, val_batches, nb_epoch=1)

现在,我们已经有了一个分类猫和狗的模型,只要给出正确的目录,它很容易来产生任何图像的分类问题。

接下来一行一行分析代码:

使用Vgg16来进行基本的图像识别

创建一个Vgg16对象:

vgg = Vgg16()

Vgg16是在Keras上建立的,Keras是一个封装的深度学习库,基于Theano或者TensorFlow。使用很方便。Keras在batches中读取图像和标签,直接使用目录结构,每个训练分类的图像必须放在一个分开的目录中。下面就是从训练文件中抓取数据的batches。

batches = vgg.get_batches(path+'train', batch_size=4)

batches只是一个普通的python迭代器。

为了更好的理解Vgg16干了什么,把btach的中的图像plot出来,

这里有个独热编码(one hot encoding),有N个元素(这里只有2个元素),只有1个是1,其他都是0。比如如果分类是3个,猫,狗,袋鼠。结果就是 [0, 0, 1] 或 [1, 0, 0] 或 [0, 1, 0]。

下面的方法可以得到图像原始分类的概率,分类的索引,分类的名字:

vgg.predict(imgs, True)

使用Vgg16来 finetune 模型

原本是1000个指定的类别,为了将输出变成我们要的猫和狗两个类型,就是进行所谓的”finetune”。

先填充batches

batch_size=64
batches = vgg.get_batches(path+'train', batch_size=batch_size)
val_batches = vgg.get_batches(path+'valid', batch_size=batch_size)

调用finetune()来修改模型,分批提供数据来预测猫和狗。

vgg.finetune(batches)

最后,使用训练数据fit()模型的参数,每个epoch之后会打印出在验证集上精确度。一个epoch就是对训练数据的一次完全训练。

vgg.fit(batches, val_batches, nb_epoch=1)

可以看到精确度并不高,因为只是simple训练集,符合预期。接下来切换到完整目录,再来一次,最后会得到很高的97%精确度。

课程地址:https://www.youtube.com/watch?v=Th_ckFbc6bI

以上是关于[深度学习]七行代码体验深度学习的神奇的主要内容,如果未能解决你的问题,请参考以下文章

[深度学习]网络结构,权重初始化,激活函数,fine-tune

[深度学习]网络结构,权重初始化,激活函数,fine-tune

深度学习的异构加速技术:AI 需要一个多大的“心脏”?

深度学习100例-循环神经网络(RNN)心脏病预测 | 第46天

深度学习100例-循环神经网络(RNN)心脏病预测 | 第46天

深度学习100例-循环神经网络(RNN)心脏病预测 | 第46天