来,换个轻松话题,深度学习


今天
,笔者将和读者一起聊聊一个令人轻松愉快的话题,关于深度学习。

题外话

最近,笔者取关了不少微信公众号,套路太深且广告太多,难道不明白大部分人的时间都不够用吗!说什么文正香,意更深,甚荒唐,到头来不过是为广告作嫁衣裳。
聊人生就好好聊,写技术就认真写,谈感情就专心谈。如果是广告,请光明正大的宣传,至少读者看标题就可以选择不看,别把一篇文章搞的四分五裂,稀巴烂。
朋友圈官方推送的广告貌似多了起来,好歹加个开关设置,一键取消广告显示,如果舍不得,试试 hou zhe lian pi 搞个啥会员的,看看香不香。
各有所好,无可厚非,请相互尊重。
笔者写技术文章纯粹为了分享和交流学习,目前还会继续使用公众号发表文章,以后再探索或创建其他文明开放的方式。

正题

关于前面的题外话,权且当做笑话看好了,笑一笑十年少。
下面我们正式进入主题。
关于深度学习,一直不缺话题,而且这些年深度学习领域一直迅速发展,推动了计算机视觉、自然语言处理、自动语音识别、强化学习等领域的飞速发展。应用场景也很多,比如人脸识别、图像识别、文字识别、自动驾驶、机器人客服等。
今天,我们聚焦开源项目 MXNet 以及一个非常好的深度学习的社区(https://github.com/d2l-ai),希望通过本篇文章的讲解,对大家进入深度学习领域有所帮助。

MXNet

MXNet 是一款轻量灵活的深度学习框架。查看官网,发现 MXNet 生态系统比以前庞大许多,提供丰富的库和工具支持开发。

1. D2L.ai

官方提供的带有交互式的 Jupyter notebook、数学公式和专门讨论论坛的深度学习书。对于初学者,带来的非常大的帮助。
下文会对 d2l.ai 进行详细讲解。

2. 丰富的工具

  • GluonCV

GluonCV 提供了计算机视觉领域最先进的(SOTA)深度学习算法的实现,可以帮助工程师、研究人员和学生快速制作产品原型,验证新想法并学习计算机视觉。

  • GluonNLP

GluonNLP 提供了 NLP 领域顶级深度学习模型的实现,且建立了文本数据管道和模型的模块。设计上,它同样也是为了让工程师、研究员和学生能快速的实现研究思路,做出产品原型。

  • Gluon Time Series (GluonTS)

一种使用 Gluon API 的 MXNet 时间序列分析工具包。借助 GluonTS,用户可以利用包含有用抽象的预构建块来构建时间序列模型。

3. 生态系统


MXNet 生态系统还是比较丰富的,读者可以去寻找自己感兴趣的项目,比如人脸识别项目 InsightFace(https://github.com/deepinsight/insightface)。
有些项目需要 GPU 的支持,后续笔者会选择一些项目进行研究、实战和技术输出。
接下来,笔者带大家看一下 D2L.ai 这个开源项目,动手学习深度学习。

D2L.ai

D2L.ai 开源项目致力于:

  • 所有人均可免费获取学习深度学习的资料
  • 提供足够的技术深度,从而帮助读者实际成为深度学习应用科学家:既理解数学原理,又能够实现并不断改进方法
  • 包含可运行的代码,为读者展示如何在实际中解决问题。这样不仅直接将数学公式对应成实际代码,而且可以修改代码、观察结果并及时获取经验
  • 允许我们和整个社区不断快速迭代内容,从而紧跟仍在高速发展的深度学习领域
  • 由包含有关技术细节问答的论坛作为补充,使大家可以相互答疑并交换经验

感谢原创者以及社区技术爱好者的贡献。

项目信息

Github 英文项目和 PDF 书籍:

https://github.com/d2l-ai/d2l-en 
https://d2l.ai/d2l-en.pdf 
https://d2l.ai/d2l-en.zip

Github 中文项目和 PDF 书籍:

https://github.com/d2l-ai/d2l-zh 
https://zh.d2l.ai/d2l-zh.pdf 
https://zh.d2l.ai/d2l-zh.zip

伯克利深度学习课程:

https://courses.d2l.ai/berkeley-stat-157/index.html

社区讨论地址:

https://discuss.gluon.ai

这里简单列一下官方的介绍:

该开源项目全面介绍深度学习从模型构造到模型训练的方方面面,以及它们在计算机视觉和自然语言处理中的应用。不仅将阐述算法原理,还将基于 Apache MXNet 对算法进行实现,并实际运行它们。
项目中的每一节都是一个 Jupyter Notebook。它将文字、公式、图像、代码和运行结果结合在了一起。读者不但能直接阅读它们,而且可以运行它们以获得交互式的学习体验。
本书并不要求读者有任何深度学习或者机器学习的背景知识,我们将从头开始解释每一个概念。读者只需具备基础的数学和编程,如基础的线性代数、微分和概率,以及基础的 Python 编程即可。
如果对 Python 不熟悉,建议提前学习一下,推荐的学习地址:

http://www.runoob.com/python/python-tutorial.html https://www.learnpython.org

对于 Python 快速入门即可,不是要成为所谓的专家,保持初心啊。否则本来是要学习深度学习的,结果跑去钻研 Python,然后又走了一遍从入门到放弃,芝麻和西瓜都丢了,甚是可惜。
最后笔者再补充几点:

  • 本书选择的深度学习框架是 MXNet
  • 希望读者根据每个章节认真学习,并坚持下去
  • 本书力求提供一个多方位交互式的学习体验

具体细节,感兴趣直接访问官方介绍:

https://zh.d2l.ai/chapter_how-to-use/how-to-use.html

环境准备

1. 安装 miniconda

官方下载页面:

https://docs.conda.io/en/latest/miniconda.html

笔者基于 MacOSX 实战操作。

  1. 下载安装脚本并运行
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh


$ sh Miniconda3-latest-MacOSX-x86_64.sh

  1. 安装完成后,需要让 conda 生效,需要运行一次 source ~/.bash_profile 或重启命令行应用。

2. 下载示例代码

conda 环境准备完成后,接着下载包含本书全部代码的压缩包。

$ mkdir d2l-zh && cd d2l-zh


$ wget https://zh.d2l.ai/d2l-zh-1.1.zip
$ unzip d2l-zh-1.1.zip && rm d2l-zh-1.1.zip

3. 使用 conda 创建虚拟(运行)环境

如果无法科学上网,可以配置 conda 和 pip 镜像来源:

# 配置清华 PyPI 镜像(如无法运行,将 pip 版本升级到 >= 10.0.0)

$ pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

开始使用 conda 创建虚拟环境并安装本书需要的软件。这里使用的 environment.yml 是放置在代码压缩包中的文件,可以打开看到依赖的组件版本信息。

$ conda env create -f environment.yml

4. 激活 conda 创建的环境

为了使用下载的代码示例,必须要激活上面创建的 conda 环境。

# 若 conda 版本低于 4.4,使用命令 activate gluon

# 笔者的环境 conda 版本为 4.8.2

$ conda activate gluon

如需退出虚拟环境,可使用命令如下命令:

# 若 conda 版本低于 4.4,使用命令 deactivate

# 笔者的环境 conda 版本为 4.8.2

$ conda deactivate

5. 打开 Jupyter notebook

$ jupyter notebook

正常情况会自动打开 http://localhost:8888/tree 网页。

6. 更新代码和运行环境

为了适应深度学习和 MXNet 的快速发展,本书的开源内容将定期发布新版本,推荐大家定期更新开源内容(如代码)和相应的运行环境(如新版 MXNet)。以下是更新的具体步骤。

  1. 重新下载最新的全部代码的压缩包并解压缩
$ wget https://zh.d2l.ai/d2l-zh.zip

解压后进入文件夹 d2l-zh。

  1. 更新运行环境
$ conda env update -f environment.yml
  1. 激活环境和运行 Jupyter notebook

7. MXNet on GPU

玩深度学习,是不是没有 GPU 都不好意思说出口。
通过前面介绍的方式安装的 MXNet 只支持 CPU 计算。示例中某些章节需要或推荐使用 GPU 来运行。如果计算机上有 NVIDIA 显卡并安装了 CUDA,建议使用 GPU 版的 MXNet。

7.1 卸载 CPU 版本 MXNet

如果没有安装虚拟环境,可以跳过此步。如果已安装虚拟环境,需要先激活该环境,再卸载 CPU 版本的 MXNet。

$ pip uninstall mxnet

然后退出虚拟环境。

7.2 更新依赖为 GPU 版本的 MXNet

修改 environment.yml 文件,将里面的字符串 mxnet 替换成对应的 GPU 版本。例如,如果计算机上装的是 8.0 版本的 CUDA,将该文件中的字符串 mxnet 改为 mxnet-cu80。如果计算机上安装了其他版本的 CUDA(如 7.5、9.0、9.2 等),则做类似的修改。

7.3 更新虚拟环境

$ conda env update -f environment.yml

7.4 激活安装环境

激活安装环境后,就可以使用 GPU 版的 MXNet 运行示例代码了。

示例练习几点建议

如果数学基础已经差不多还给老师了,那挺佩服你竟然敢进来读这篇文章,说明你已经成功一半了。
提供几点学习的建议:

  • 跟着 https://zh.d2l.ai 一步一步来,不要一开始就被线性代数、微分和概率等数学知识吓倒,也就那么点知识,慢慢积累,都是鸡腿
  • 找些感兴趣的例子实战,比如人脸识别、目标检测等
    识别老板人脸,快速自动切换屏幕,想一想,是不是自己都乐了。
  • 多记笔记多思考多总结
    有时候,的确没有具体的业务需求,如果前期积累没有做笔记,那么时间长了,可能就忘记了,再学习,时间成本增加不少。

GluonCV 实战

GluonCV 是基于 MXNet 的计算机视觉库,为计算机视觉处理提供了顶级的算法实现与基本运算。
本示例展示了如何只用几行代码就可以使用经过预先训练的 SSD 模型,对图片中的图像进行识别并标记。SSD 是目前应用非常广泛的目标检测算法。

1. 安装库

$ pip install gluoncv

2. 基于 Jupyter notebook 开发

使用上面已经打开了 Jupyter notebook,新建一个 Python 3 开发环境。

2.1 导入依赖库

导入项目依赖的库:

from gluoncv import model_zoo, data, utils

from matplotlib import pyplot as plt

2.2 加载预训练模型

net = model_zoo.get_model('ssd_512_resnet50_v1_voc', pretrained=True)

如果模型不存在,则直接从网上下载,部分日志如下:

Downloading /Users/dataflow/.mxnet/models/ssd_512_resnet50_v1_voc-9c8b225a.zip from https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/models/ssd_512_resnet50_v1_voc-9c8b225a.zip...

2.3 预处理图像

im_fname = utils.download('https://github.com/dmlc/web-data/blob/master/' + 'gluoncv/detection/street_small.jpg?raw=true', path='street_small.jpg')

x, img = data.transforms.presets.ssd.load_test(im_fname, short=512)

print('Shape of pre-processed image:', x.shape)


下载图像,并使用预设的数据转换进行预处理。在这里,笔者指定将图像的短边尺寸调整为512像素。

2.4 检测并显示结果

class_IDs, scores, bounding_boxes = net(x)


ax = utils.viz.plot_bbox(img, bounding_boxes[0], scores[0], class_IDs[0], class_names=net.classes)
plt.show()


笔者再从网上下载一张图片,如下:


再次利用上面的模型进行处理,结果如下:


其实这个模型训练的质量很差,只是一个 demo 而已,不要在意。等你慢慢学通了,再来进行优化。

总结

在本篇文章中,笔者把 MXNet 生态圈大概过了一遍,然后带大家学习 D2L.ai 项目并进行了简单的案例实战。
文章都看完了,如果不坚持学习,真的说不过去了。

参考

  • https://d2l.ai
  • https://gluon-cv.mxnet.io/build/examples_detection/demo_ssd.html#sphx-glr-build-examples-detection-demo-ssd-py