工欲善其事,必先利其器:Jupyter Notebooks 的技巧

在 这些视频 中,你已经看到过我在屏幕上直播写的 Python 代码以及这些代码的运行结果了。那么今天我就来跟大家分享一下我是如何实现,以及一些相关的实用技巧。
这是一个系列视频/文章 「AI Adventures」中的第十四篇,由 Google 的开发技术推广工程师 Yufeng Guo 主讲,用通俗易懂的语言帮助你了解人工智能和机器学习。在这一系列视频/文章中,我们将一起探秘人工智能的世界,共同品味艺术、探索科学以及掌握机器学习的工具。
第一篇: 机器学习是什么?
第二篇: 机器学习「七步走」
第三篇: 用评估器给花卉分类
第四篇: 弹性伸缩的云端托管服务
第五篇: 通过 TensorBoard 将模型可视化
第六篇: 通过深度神经网络再识评估器
第七篇: 云端训练模型的大数据解决方案
第八篇: 跟着 Google Research 体验自然语言生成
第九篇: 云上的机器学习引擎
第十篇: 使用 MNIST 数据集训练模型
第十一篇: 机器学习工程师用 Python 开发环境的最佳实践
第十二篇: 机器学习之前,让「大熊猫」先尝一尝数据的味道
第十三篇: 机器学习大杀器:爆米花般火爆的 Kaggle Kernels
所有的内容和视频都会首发在「 机智如你 」专栏,目标是发布最新与谷歌相关的机器学习、TensorFlow 相关内容,如果你有任何问题,也欢迎在留言区向我们提出反馈。

我在屏幕上直接运行 Python 代码是通过一个叫 Jupyter 的 Python 包来实现的。Jupyter 是基于 IPython 项目开发的,它让开发者能够在浏览器中感受交互式的 Python 编程体验。但是它能做的可远不止这些,无论是 bash 命令、Magic 魔法操作符还是一些插件,Jupyter 都极大改善了你的 Python 编程体验。
如果你已经是 Jupyter 的老手了,希望我这些分享能改善你的工作流程且提供一些技巧贴士。加入你还没用过,也不需要担心,我们一起探讨吧。
「译者注」文末对 Jupyter 和 IPython 有一定的补充,广大读者可以参阅。
安装和启动
安装 Jupyter 最简单的方式是执行
pip install jupyter
命令(当然,如果你用了一些自带这些包的 Python 发行版,忽略这个最简单)。一定要首先搞定 Python 环境,我们一起来操作一下。
当在本地运行 Jupyter 时,你将通过浏览器访问运行在本机的一个 Web 服务器,常常是在 8888 端口上的。在当前的工作目录执行
jupyter notebook
就能运行起来了。通常 Jupyter 会在启动后自动打开浏览器访问 Web 页面,不过假如你的没有这样,则可以在浏览器手动输入
localhost:8888
访问。
如果环境中没有你需要打开的 notebook,那么请通过点击「New」并选择对应的版本(取决于你环境变量中的 Python 版本)。Jupyter 伸缩性极强,能够提供多种语言和文件格式支持,而目前我们只用得上 Python。
在 Jupyter Notebooks 中执行代码
开启新的 notebook 之后,我们就可以在空格当中写一些 Python 代码,然后按下
ctrl+enter
来执行。我们可以在其中编写和运行通常那些在 Python 脚本中使用的代码。其差别就是我们可以立即执行并看到结果。
注意观察当我们按下
ctrl+enter
的时候,空格左侧的方括号会出现一个星号,当执行结束之后星号会编程表示当前执行的操作在整个会话中的次序(从 1 开始)。

最后一行命令的执行结果会被输出到界面中作为此格操作的输出信息,但这个特性在当你的最后一句是将某个值存于变量中时不会生效。举个例子,我将 tensorflow 包引入,并将其版本与一个字符串连接,最终输出如下(注意我没有使用 print 命令)。
当然,我也能用 print() 函数来实现。不过这一特性在摆弄代码、观察结果方面十分有用。
Shift-Tab 组合键
Jupyter notebook 的另一个非常赞的特性是:你可以通过按下
shift-tab
组合键来显示当前函数的说明摘要。这使得你可以很轻松而准确地进行函数调用,而不需要每次都在完整说明文档中苦苦寻找。

此特性对于你的自定义函数仍然有效。所以说文档写得好,麻烦也减少!
输出的内容
当你输出了大量的内容时,你可以通过单击输出区域左侧的面板来讲它们收拢,这样就可以通过滚动来查看了。如果双击,则会直接将所有的输出都收起来,不再展示。

格子++
一个空格其实已经很棒了,但我们的确需要更多的格子。此时,点击工具栏的加号就能创建一个新的格子,而其他的还有一些命令可以创建新的格子。
如果你点击
shift+enter
,当前格子当中的内容会被执行,然后后面的格子会高亮显示。如果后面没有新的格子了,那么 Jupyter 会帮你创建一个新格子。另一方面,如果你想在给定的格子后面立即创建新的一格,则可以使用
alt-enter
组合键执行当前格子的内容,然后在后面插入一个新的格子。

诶,你要用 Markdown?
可能目前我没提到的最赞的特性就是 Markdown 语法支持了。我对 Jupyter notebooks 的第一印象是它能够同时写代码和描述代码的特性。Markdown 的富语义特性使之为研究者、讲师等角色能够轻松简洁交流、传播其观点。
并且最重要的是,它让「曾经的你」向「将来的你」讲解某些代码具体是做什么的,这比起用评论块的方式不知道高到哪里去了。
Jupyter Magics 魔法操作符
有时候,我只想快速查看某个训练或评估流程占据了多少时间。一种简便的方式是在空格的一开始使用 %%time 魔法操作符,一旦当前格子执行完成,它将会输出执行的耗时。虽说它不像原子时那么精准,但却是一种花最小力气就能了解到大致情况的好办法。
如果你想要在 notebook 中执行命令行语句,最简单的方式是在语句最前面加上一个感叹号。这种便利在执行一次性语句时尤为明显。
假如你要执行的是一段命令,那么在格子最前面使用 %%bash 魔法操作符就能将整个格子的内容解释成 bash 脚本了。
这一特性的典型应用场景是 TensorBoard 。通常来说,启动 TensorBoard 需要开启新的命令行窗口,然后在其中执行相关的指令。但是如果你仅仅开启了看一下就要关掉,则可以放心在 Jupyter notebooks 的 bash 格子当中执行。
另外,你肯定不会忘记执行这个命令,因为它就存在于你的 Jupyter notebooks 当中。注意,这种方式会使得 TensorBoard 进程占据 Jupyter,也就是你此时不能再运行别的命令。要想停下该进程,只需点击工具栏上的 interrupt 按钮即可,这样你又回到了正常的操作模式中。

好啦,这些就是我特别喜欢的 Jupyter 特性啦。当然,这些并不是对其功能的全面描述、讲解,我只是提供了一些我最常用的而已。还有很多很多的内容,值得你到 官网 去探索。
感谢阅读本期 Cloud AI Adventures 分享。如果你喜欢这个系列,请点个赞。如果你想学到更多关于机器学习的知识,请关注我或者 Yufeng G 的 Medium 亦或是关注《 机智如你 》专栏或是 YouTube 频道 。赶紧关注,不要错过更多精彩!
P.S. 你觉得文中的 gif 怎么样?它们是否有帮助?或者影响了你阅读的节奏?它们简明扼要了还是让你更加疑惑了?请告诉我!
▏原文出处: Medium - Interactive Data Science with Jupyter Notebooks
▏封面来源: YouTube 视频缩略图
▏视频出处: YouTube - Jupyter Tips and Tricks
▏字幕翻译: 谷创字幕组
▏文章编辑: @杨栋
「尾注1」Yufeng 的原文中使用了很多精美的 gif 图像,但是由于知乎的限制,无法将 gif 上传,必须采用替代办法。此前,我们两次将 gif 上传到了 CDN 中,在原文中提供 gif 中某一帧截图,并后附 CDN 中 gif 的链接地址。本期文章我们尝试将 gif 转为了小段的视频,除了减少了流量消耗,还希望能够给大家更简便、快捷的阅读体验。请将你宝贵的反馈信息反馈给我们,以便我们今后使用最佳方案创作,谢谢。
「尾注2」Jupyter 的特性在文中已经介绍了不少了,这里进行一个简单概括、补充。Jupyter 本身是基于 IPython 项目开发的,所以继承了来自 IPython 的大量特性。当你使用 Jupyter notebooks 功能时就像是在使用一款集成了开发、文档、调试于一体的 Machine Learning IDE。文中的格子是 Jupyter 的最小可执行单位,每一段代码都会在其中执行。