[深度学习]七行代码体验深度学习的神奇(代码片段)

yofer张耀琦 yofer张耀琦     2022-12-09     716

关键词:

简介

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

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

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

由于下面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

小白入门深度学习|第三篇:深度学习初体验(代码片段)

文章目录一、深度学习是什么二、实现过程1.准备数据2.构建神经网络模型3.编译模型4.训练模型5.预测三、总结课后练手项目(附代码+讲解)🚀我的环境:语言环境:Python3.6.5编译器:JupyterNotebook深度学... 查看详情

深度学习之tensorflow安装与初体验(代码片段)

深度学习之TensorFlow安装与初体验学习前搞懂一些关系和概念首先,搞清楚一个关系:深度学习的前身是人工神经网络,深度学习只是人工智能的一种,深层次的神经网络结构就是深度学习的模型,浅层次的神经网络结构是浅度... 查看详情

神奇的streamlit(哇原来深度学习还可以这样玩)(代码片段)

神奇的streamlit(原来深度学习还可以这样玩)文章目录神奇的streamlit(原来深度学习还可以这样玩)Streamlit简介Streamlit带来的改变Streamlit的简单应用Streamlit部署计算机视觉(图像分类和目标检测)图像分类部署目标检测   ... 查看详情

深度体验学习国产api工具eolink(代码片段)

作为一名前端开发人员,在我们的项目中少不了各种API接口。但是接口都是由后端人员完成,我们想请求接口的话必须等后端人员完成工作。那么问题就来了,如果后端人员完成工作较慢或者是有所耽误就会影响前端... 查看详情

深度学习100例-卷积神经网络(cnn)识别神奇宝贝小智一伙|第16天(代码片段)

文章目录一、前期工作1.设置GPU2.导入数据3.查看数据二、数据预处理1.加载数据2.可视化数据3.再次检查数据4.配置数据集三、调用官方网络模型四、设置动态学习率五、编译六、训练模型七、模型评估八、保存and加载模型九、预... 查看详情

markdown[深度学习]有用的深度学习代码!#dl#objectdetection(代码片段)

查看详情

《深度学习100例》数据和代码(代码片段)

《深度学习100例》分为《深度学习基础50例》与《深度学习进阶50例》,大家可以选择一次性订阅《深度学习100例》也可以分开订阅。《深度学习基础50例》:主要讲解深度学习中的一些基础算法,主要体现在目标识别,以及循环... 查看详情

小白入门深度学习|第三篇:深度学习初体验

文章目录一、深度学习是什么二、实现过程1.准备数据2.构建神经网络模型3.编译模型4.训练模型5.预测三、总结课后练手项目(附代码+讲解) 查看详情

深度学习入门2022最新版深度学习简介(代码片段)

【深度学习入门2022最新版】第一课深度学习简介概述深度学习vs机器学习机器学习是什么深度学习是什么机器学习和深度学习的区别神经网络机器学习实现二分类神经网络实现二分类TensorFlowPyTorch神经网络的原理张量张量最小值(... 查看详情

深度学习深度学习基础学习笔记(代码片段)

深度学习基础🔭文章目录深度学习基础🔭前言🎠一、深度学习与传统机器学习的区别?二、深度学习的改进点1.更加合适目标函数2.新增Softmax层3.激活函数进化历程4.梯度下降算法进化历程5.BatchNormalization的由来6.... 查看详情

14深度学习-卷积(代码片段)

1.简述人工智能、机器学习和深度学习三者的联系与区别。(1)人工智能是目的,是结果;深度学习、机器学习是方法,是工具;(2)机器学习,一种实现人工智能的方法;机器学习都可以被精准地定义为:1、任务T;2、训练... 查看详情

14深度学习-卷积(代码片段)

1.简述人工智能、机器学习和深度学习三者的联系与区别。答:人工智能是最早出现的,也是最大、最外侧的同心圆;其次是机器学习,稍晚一点;最内侧,是深度学习,也是当今人工智能大爆炸的核心驱动。 人工智能是目... 查看详情

14深度学习-卷积(代码片段)

1.简述人工智能、机器学习和深度学习三者的联系与区别。 联系:深度学习使得机器学习能够实现众多应用,并拓展了人工智能的领域范畴。区别:人工智能是目的,是结果;深度学习、机器学习是方法,是工具;深度学习... 查看详情

深度学习框架介绍(代码片段)

深度学习框架介绍1.常见深度学习框架对比2.TensorFlow的特点3.TensorFlow的安装4.Tenssorlfow使用技巧1.常见深度学习框架对比tensorflow的github:2.TensorFlow的特点官网:https://www.tensorflow.org/语言多样(LanguageOptions)TensorFlo 查看详情

14深度学习-卷积(代码片段)

1.简述人工智能、机器学习和深度学习三者的联系与区别。解析:人工智能是机器诠释的人类智能,是机器学习和深度学习后想实现的结果和目的,机器学习是实现人工智能的方法,深度学习是机器学习算法中的一种算法,一种... 查看详情

pytorch2如何通过算子融合和cpu/gpu代码生成加速深度学习(代码片段)

...获、中间表示、运算符融合以及优化的C++和GPU代码生成的深度学习编译器技术入门计算机编程是神奇的。我们用人类可读的语言编写代码,就像变魔术一样,它通过硅晶体管转化为电流,使它们像开关一样工作,并允许它们实现... 查看详情

深度学习100例|第27天-卷积神经网络(cnn):艺术作品识别(代码片段)

...文GitHubhttps://github.com/kzbkzb/Python-AI已收录,有Python、深度学习的资料以及我的系列文章。大家好,我是K同学啊!今天的案例是世界名画的分类识别🚀我的环境:语言环境:Python3.6.5编译器:jupyternotebook... 查看详情

tensorflowdnnregressor实现深度学习的代码(代码片段)

...本文介绍基于Python语言中TensorFlow的tf.estimator接口,实现深度学习神经网络回归的具体方法。(基于PythonTensorFlowEstimator的深度学习回归与分类代码——DNNRegressor)1写在前面  1.本文介绍的是基于TensorFlowtf.estimator接口的深度学习网... 查看详情