# Tensorflow 开发者认证记录

> 7 天大概就够了

---

LLMS 索引： [llms.txt](/llms.txt)

---

<!-- # Tensorflow 开发者认证记录 -->

又名：我是如何在 7 天内通过 Tensorflow 开发者认证的，以及你应该这样做吗？

> 作者在 2021/7/4 参加考试。本文写于 2021/7/7。文中内容可能在未来发生变化。
>
> 下文简称 Tensorflow 为 TF，机器学习（Machine Learning）为 ML，深度学习（Deep Learning）为 DL。虽然 DL 在分类上而言是 ML 的一部分，但鉴于 DL 在各大领域取得的进展，常常将 ML 和 DL 并列。


## TL;DR

* 7天（甚至更短时间内）通过 TF 开发者认证是可行的。
* 就实践水平而言，这一认证的含金量并不高（有点水），通过认证只意味着认证人具有基本的，使用 TF 进行图像分类/文本分类/时间序列预测任务的能力。
* 与其代表的实际水平相比，这一认证更大的意义可能在于强迫自己去阅读/学习，以及向潜在的雇主证明自己有能力/意向进行 ML/DL 的相关工作。



## 预备知识

### 这个证书是什么？

* Tensorflow 是一个 Google 创建的开源的 DL 框架，使用广泛，也在 Google 内部支持着许多服务
* Tensorflow Developer Certification 是 Google 的一个认证项目，在 2020 年 3 月开始，旨在证明认证人有能力使用 Tensorflow 建立 DL 模型，完成指定任务。

### 为什么你可能会想要这个证书？

* 通过考证的过程学习 ML/DL 的相关知识
* 向未来的雇主证明自己有意愿/有能力完成 ML/DL 相关的工作

### 考试如何进行？

* 报名费 $100，缴费后 180 天内需参加考试

* 5 小时时限，5 个任务，全部完成后可以提前结束
* 每个任务需要提交一个模型，可以随时提交，提交后几乎立刻可以得到一个五分制的反馈
* 不同任务的分值不同，但是没有明确列出。理论上要求总分在 90% 以上通过
* 每个任务包含题目描述和代码框架，并不是从零开始，更接近填空
* 因为模型需要在远端测评架构上进行评分，模型输入和输出是被严格限定的，主要能调整的是模型架构和训练过程
* 考试要求 Pycharm，但 Pycharm 实际上只是考试 UI，实际的模型建立/训练可以在其他设备/平台上进行（如 Colab，Jupyter Notebook），只需要把最后得到的模型文件（.h5）放回考试目录下即可
* 不限制网络使用，可以使用任何资源答题
* 考试失败后，需要间隔一段时间才能再次参加（首次 14 日，第二次一个月，第三次一年）

### 我的个人背景

* 我自己从大三开始，陆陆续续修了一些数据科学/深度学习相关的课程，但是除了课程作业之外没有多少实践。
* 自己之前主要使用的 DL 框架是 PyTorch，对于 TensorFlow 了解不多。
* 现在算是暑假期间，暂时有一些自己的空闲时间。
* 之前一直想通过读 HOML （*Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition*）来学习使用 TF 的知识，但是静不下心去强迫自己学习。
* 好奇 Google 会如何通过证书考试的形式量化开发者的能力。

### 我参加这一考试的目标

* 熟悉 TF 的架构和使用。

* 掌握使用 TF 构建 DL 模型，完成数据科学任务的全流程（从数据输入到模型在生产环境上线）。
* 能够完成常见的 DL 任务（图像/文本/时间序列/结构化数据）。

后文将会回顾这些目标的完成度。



## 考前准备

我首次听说这个考试是在 Daniel Bourke 的[视频 (YouTube)](https://www.youtube.com/watch?v=ya5NwvKafDk)，主要使用的相关资料也主要参考了他的[博客](https://www.mrdbourke.com/how-i-got-tensorflow-developer-certified/)。此外，TFUG 苏州的这一[视频讲解 (Bilibili)](https://www.bilibili.com/video/BV1wf4y117qF/?p=2) 及 [微信公众号文章](https://mp.weixin.qq.com/s?__biz=MzAwNTM2ODk3NA==&mid=2247483889&idx=1&sn=179ae82e14984af2b07f6d5363d60aaa) 也提供了一些帮助。

### 资源

以下资源按重要程度排序。

1. TF 开发者证书候选人手册（[中文版 link](https://www.tensorflow.org/site-assets/downloads/marketing/cert/TF_Certificate_Candidate_Handbook_zh-cn.pdf?hl=zh-cn)，[英文版 link](https://www.tensorflow.org/extras/cert/TF_Certificate_Candidate_Handbook.pdf)）
   TF 开发者证书考试指导，TF 开发者证书考试环境配置（考前可从考试平台下载）

   **必须。**《候选人手册》是最重要的官方文档，需要详细阅读。其中有一个技能清单（Skill Checklist），基本上也就是考试会覆盖的主要内容了。《考试指导》和《环境配置》两个文档在为考试缴费后才在考试平台上可见，建议在开考前先通读一遍，并试着自己建立环境，以避免开考后遇到环境配置问题。

2. 在线课程《DeepLearning.AI TensorFlow Developer 专业证书》（[Coursera](https://www.coursera.org/professional-certificates/tensorflow-in-practice)， [课程 Notebook Repo](https://github.com/lmoroney/dlaicourse)）

   **必须。** 实际上是四门课程的集合，分别覆盖深度学习基础、CNN、NLP和时间序列。和技能清单几乎完全重合（实际上课程主讲和证书发放签名人是同一位）。课程内有视频和在线测评环境，习题也和真正的考试试题**差不多**，基本上能跟着完成课程，考试也就不会有太大问题了。课程本身价格是 $59，但是有一周的免费试用（需要银行卡），可以快速刷完后取消付款方式关联。

3. 书籍 (HOML)《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition》（中文版：《*Scikit*-*Learn*、*Keras* 与*TensorFlow* 机器学习实用指南(第二版)》）（[O'Reilly](https://learning.oreilly.com/library/view/hands-on-machine-learning/9781491962282/) ，[书 NoteBook Repo](https://github.com/ageron/handson-ml/))

   **推荐。** 这本书更接近延伸阅读材料，内容本身超出考试很多，但是对构建知识体系更有帮助。有些内容在线课程里说的不是很清楚（如 `tf.Dataset` 的使用），书里会有更详细的讲解。和考试相关的部分是第 10 章至第 16 章。我所在的学校购买了 O'Reilly 的电子订阅，因此我选择在 iPad 上进行阅读，但是也可以购买纸质版本阅读。

4. TF 官方文档（[教程](https://www.tensorflow.org/tutorials?hl=zh-cn)，[指南](https://www.tensorflow.org/guide)）

   **可选。** 教程类似于 Cookbook，有解决各种任务的示例。指南则更注重底层原理和基础知识。可以先浏览一遍目录，在遇到不懂之处的时候进行查阅。如有时间也可通读。



### 学习思路

面对这种多种资源覆盖同一主题的情况，一般有两种学习思路：

* 纵深：一次学习所有和这个主题相关的资源
* 重复：一次学习一个特定资源，在不同主题间重复

| 纵深                                                         | 重复                                                       |
| ------------------------------------------------------------ | ---------------------------------------------------------- |
| ![纵深](/img/tf-cert-blog-1.png) | ![重复](/img/tf-cert-blog-2.png) |

在 Daniel Bourke 的博客分享中，他使用的是纵深的学习思路（*tribird approach*，一石三鸟），每天选定一个主题，首先看对应的在线课程，然后阅读书籍，再花时间写代码练习，最后看 MIT 的视频收尾。但是根据我自己的经验，我更习惯于重复的学习思路，需要让大脑把知识在后台处理一段时间，才能找到一些没想清楚的地方，从而进一步学习。各位读者可以根据自己的习惯选择合适的路线。



### 学习时间线

* Day 1：通读《候选人手册》，打印技能清单作为速查备忘。在考试平台上注册考试并缴费（需要提前完成，身份审核需要一段时间）。学习在线课程的前两个课程，完成课后习题。（学习时间约 8h）
* Day 2：学习在线课程的后两个课程，完成课后习题。（学习时间约 10h）
* Day 3：阅读书籍的 10 ~ 13 章并做笔记，同时查看相关笔记本的代码示例。（学习时间约 8h）
* Day 4：阅读书籍的 14 ~ 16 章并做笔记，同时查看相关笔记本的代码示例。阅读 TF 官方指南中的「Keras」部分。（学习时间约 10h）
* Day 5：阅读 TF 官方教程中的「Keras 机器学习基础知识」、「加载和预处理数据」、「图像」、「文本」、「结构化数据」部分。处理之前笔记中遗留的部分问题。开始尝试从零实现 Day 1 中的作业（首先复现，然后使用不同的数据集）。（学习时间约 12h）
* Day 6：开始尝试从零实现 Day 2 中的作业。复现 TF 官方教程中的几个自己认为有趣的示例。尝试使用 Keras-tuner。根据环境配置文档准备准备考试环境。（学习时间约 12h）
* Day 7：复习笔记。重新阅读《候选人手册》和《考试指导》。在 Pycharm 下复现一个之前的作业。（学习时间约 8h）

* Day 8：参加考试。



### 学习建议

* 建立自己的 code snippet （代码片段）集合，在需要的时候可以快速查阅（常用的网络结构、常用的预处理代码、常用的 Callback...）
* 建立 checklist（检查清单），如
  * 模型精度不符合预期的可能出错点（根据自己完成作业的经历建立）
  * 过拟合的处理方式（根据自己的经验和阅读的相关资料）
* 保留所有自己写过的代码，以备查阅



### 设备与环境

我自己使用的是实验室内的工作站，GPU (Quardo M2000, 4G VRAM) 比较老旧，系统是 Ubuntu 18.04，Pycharm 版本 2021.1.3 Community。为了保险，考前在学校的超算上申请了一个 GPU 示例备用，GPU 为 RTX2080。

考试本身需要训练的模型其实都不会太大，根据《考试指导》中的描述，如果能在本地跑通 [图像分类](https://www.tensorflow.org/tutorials/images/classification) 和 [文本分类](https://www.tensorflow.org/text/tutorials/text_classification_rnn) 这两个示例，基本就不会有问题了。再加上有五个小时的时间，一般情况下是不用担心本地算力过低导致训练失败的。如果条件是在比较有限，可以使用 Colab 进行训练，或者是在主流的云厂商平台上购买带有 GPU 或是为深度学习优化过的实例。

考试是在 virtualenv 的虚拟环境中建立的，需要提前在系统级别安装 Python 3.8 版本。官方的《考试指导》中特别注明了不可以使用 Anaconda，不太确定原因，但是最好遵守。

需要注意的是，Pycharm 本身虽然可以设定使用远程 SSH 连接下的 Python Interpreter，但是这一配置是不受到考试插件支持的，因此最好直接在具有 GPU 的设备上安装 Pycharm 和考试插件。

网络环境方面，因为考试本身需要从 Google 的服务器下载数据集和上传模型，建议自行确保到国际互联网的连接质量，或是在网络低峰期参加考试。数据集在代码中使用 `request` 库进行下载，但是也可以手动使用其他工具下载后放置于考试目录内。



## 考试中

* 需要提前准备系统的 Python 3.8 环境，并在 Pycharm 内安装一个 TF Certification Exam 插件。
* 插件运行后首先需要登录 Google 账户认证，然后会自动创建 venv 并安装依赖。完成后显示「Start Exam」按钮，点击后即考试开始。
* 插件会自动建立一个 Pycharm 工程，其中有 5 个文件夹，命名为 Category1 到 Category5。每个文件夹内有一个 `starter.py` 为基本的代码框架，内部有 `#TODO` 注释标注需要填写的部分。在编辑`starter.py` 时，插件会自动显示本题的描述。
* 完成训练后，会在题目目录下生成 `mymodel.h5` 文件。如果使用其他设备训练，也可以从其他设备下载模型文件后，手动放置到文件夹内（需要为 h5 格式）。在插件内选择 `Submit and Test model` 就会自动提交到服务器进行测评，右下角进度条会显示上传进度，一般上传完成后 30s 内就会返回评分（0/5 到 5/5）。如果太久没有返回评分，可能是模型过大/过复杂，可以取消当前测评。
* 可以无限次提交模型。测评本身是基于后台的一部分隐藏数据的，根据部分参加者的反馈，数据存在一定随机性，即使是同一模型的多次提交，返回的分数也可能存在浮动。 
* 所有题目都拿到 5/5 评分后，即可点击插件，选择「End Exam」，确认后结束考试。

我自己的这一次考试比较幸运，因为事前自己根据《环境配置》文档验证过环境，没有遇到环境导致的问题。5 个题目都不是很难，我在开考后的 40 分钟就完成了 4 个题目并拿到 5/5，但是 NLP 的题目十分诡异，尝试了各种架构都只能得到 4/5 评分。最后换了优化器，调小学习率，增大 epoch 数慢慢训练，总算 5/5 了。最后结束考试的时候，还剩余 3 小时 10 分钟。

本次我遇到的 5 个题目是：

1. 一个很简单的回归
2. 一个你绝对已经遇到过多次的数据集的分类
3. 图像分类
4. 自然语言处理（文本分类）
5. 时间序列预测



## 考试结束后

如果通过，几分钟内就会收到通过邮件，并可以填写信息注册到 Google 的认证网络。数字证书需要几个工作日才会通过电子邮件发送。



## 回顾与总结

回顾这一周，我认为这是一次有趣的经历。可能对我而言，花钱是强迫自己学习的有效方式，至少这一周我是好好把 HOML 中的部分章节给啃下来了。考试本身比想象中容易很多，更说明通过这场考试只是一个开始，仅仅证明自己具备了基本的，跟随教程完成部分简单任务的技能，但是离真正掌握还有很远。

之前我自己定下的目标的完成情况如下：

* 熟悉 TF 的架构和使用
  * 完成（至少从完全没有经验到能快速上手构建原型了）
* 掌握使用 TF 构建 DL 模型，完成数据科学任务的全流程（从数据输入到模型在生产环境上线）
  * 部分完成（本次学习主要覆盖的是从数据输入到模型建立，但是后续部署到生产环境没有怎么覆盖）
* 能够完成常见的 DL 任务（图像/文本/时间序列/结构化数据）
  * 基本完成（每个大分类下都还有很多细分任务，本次学习只是覆盖了最基本的一些任务，但是作为基础知识与入门的介绍已经足够好了）

### 所以你应该参加这个认证吗？

在我看来，对于未来的计算机/数据科学专业的学生，ML/DL 的技能会被认为是「默认掌握」的。TF 的这个开发者认证，会更接近当前「计算机二级」认证的认可层级：对专业外的学生是额外技能的体现，对于专业内的学生则没有太大的意义。但是就当前而言，获得这一认证可能还是有其意义的，至少在一些小公司可能更容易让你通过 HR 筛。

表格：如果满足以下条件，你...参加这个认证

| 可能应该                                                     | 可能不应该                                                   |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| - 想强迫自己学点东西<br />- 从其他专业转行，需要证明自己的能力和求职意向<br />- 简历上没有太多能写的经历 | - 已经有了成熟、丰富的 ML/DL 经验<br />- 手头没有闲钱/时间<br />- 觉得 TensorFlow 太难用了，PyTorch 万岁 |
