TensorFlow 的入门资料整理与技巧

引言

今天为大家带来社区作者的精选推荐《TensorFlow 的入门资料整理与技巧》。想知道学习 TensorFlow 怎样才能少走弯路?想知道怎样逐步掌握理论知识、编程技巧,以及熟练使用框架?清华大学自然语言处理实验室研究助理、CSDN 博客专家 @DrogoZhang 分享独到经验技巧,帮助大家更顺利迈上 TensorFlow 学习之路。

写在开头:我与 TensorFlow 的故事

最早知道 TensorFlow 是在我的本科实验室,它是谷歌开发者社区 (Google Developer Group, GDG) 推广的技术之一,也是经由 GDG 首先告诉了我人工智能的概念。于是我在大二,也就是 2017 年末开始学习 TensorFlow,用自己的所有奖学金买了一块 1080Ti 构成的服务器,配置了一整天的 cuda 和 cudnn,最后在自己的机器上运行起了深度学习的 Hello W****orld:手写数字识别,同时也有了第一个收藏的 CSDN 文章:Win10 TensorFlow (gpu) 安装详解。

不久,我就可以在自己的第一个用 CNN 的项目中实现从词向量训练、NumPy 读取、placeholder、loss 函数的编写,我大概写了一个月的时间,现在想想真是效率低的可怕,不知道下一行代码该写什么,不知道 bug 究竟是啥意思。走了不少的弯路,才算是入门了 TensorFlow。

我希望帮助新入门 TensorFlow 的开发者伙伴们解决的问题是:“如何快速且正确地在TensorFlow上按自己想法实现深度学习模型“。

在这一大背景下,我试图结合自己的一些粗浅的经历,来分析一下可能的问题以及应对的方法,希望对大家入门 TensorFlow 有所帮助,当时我遇到的问题主要有 3 个方面:

  1. 理论知识欠缺(对于模型的概念和细节不熟悉)
  2. 编程技巧欠缺(不知道如何模块化的编写程序和流程)
  3. 对****于 TensorFlow 及其依赖框架的不熟悉

针对以上问题,全文贯彻一个思想:从需求出发。我想可以逐一出发,各个击破。

理论知识

理论作为深度学习时代必不可少的基础,如果要实现一些例如循环神经网络,卷积神经网络,Transformer 模块等等,概念的掌握是非常必要的。大家需要理解神经网络的本质就是一个输入输出的函数。对于一个神经网络,我们给定输入,等待他的输出就好了。这里给大家推荐一些入门的视频和书籍,可以有效地帮助大家理解概念。

1.1 视频

1. 吴恩达的深度学习视频,可以在 Coursera 上学习 deep learningmachine learning, 这是全网公认几乎最基础的深度学习入门课程了,需要的数学知识也非常非常的简单,就是基础的矩阵运算和微积分。现在还可以搭配 DeepLearning.AITensorFlow Developer 课程,开始上手 TensorFlow 认证,看评价也很赞!

2. 深度学习之父,图灵奖作者 Hinton 的课程 CSC321 Neural Networks for Machine Learning,多伦多大学的神经网络机器学习课程,早期是由 Hinton 本人上课,需要有一定的基础。

3. 斯坦福大学教授 Chris Manning 的课程 CS224n: Natural Language Processing with Deep Learning,专注于自然语言处理(夹带私货,hhhh)。

4. 基于 TensorFlow 技术推广工程师 Laurence Moroney 制作的新手入门课程,由 TensorFlow 团队与专业老师们一起合作,在中国大学 MOOC 平台推出的《TensorFlow 入门实操课程》。

1.2 书籍

  1. 《深度学习》by Ian Goodfellow, Yoshua Bengio, Aaron Courville
  2. 《机器学习》 by 周志华
  3. 《统计学系方法(第二版)》by 李航

此处不再过多推荐,基础在于牢固,概念在于理解,按需求去学习就好,感兴趣可以去看曾经整理的文章:

  1. 2019 年最佳机器学习和深度学习书籍的名单
  2. 15套免费的自然语言处理NLP课程及经典教材分享!
  3. 机器学习|深度学习|自然语言处理 学习数据/课程/资料/资源大分享

大家注意一定要学练结合,不要试图把知识全部吃透理解了再去着手去写代码,投入产出比并不高,得不偿失。

编程思维和技巧

编程是实现 TensorFlow 的重中之重,大家如果想实现一个TensorFlow模型,毫无疑问要涉及到:

  1. 数据读取
  2. 训练
  3. 测试
  4. 模型的读取和存储

那么此时如何整理项目,如何编写一个合理、模块化的程序是非常有必要的,这能让程序错误更少,方便版本升级。还是一个原则:以可读性为前提,按需求出发。

如果程序某个模块异常的复杂,比如训练模型有非常多个方式,训练的过程也比较复杂,需要过几步做一次测试,测试要做什么准备。那么这时候,将 train 写成一个函数甚至是一个类,都是非常合理的。例如 huggingface 库就有 Trainer,拥有不同的训练超参数方便应对不同情况的训练。

2. 1. 如何培养

  1. 掌握类 Class,实例 Instance 等概念;

  2. 多阅读 GitHub 的项目文献开源的入门资料库中会有代码和运行过程,思考他们的设计思路,私以为有如下的几个级别:

    1. 非常基础的入门资料,只有模型一个类,以 Jupyter Notebook 为存储格式,从头运行到尾。甚至函数也没几个;
    2. 入门资料,编写了模型类,训练函数,测试函数的 Jupyter Notebook 文件;
    3. 入门项目,将模型和数据读取等等分成了不同的 .py 文件进行处理;
    4. 复杂项目,有非常细分的包和 .py 文件,对应了也许远程服务器展示,模型部署以及测试等等;
  3. 自己编写入门项目,按照曾经思考和运行的程序进行改写。

这里没有说级别有高低之分,一切都是需求出发,面向的人群和受众面不同,因此存储的格式不一样,大家还是按照自己的需求去看和学习。

2.2. 一些技巧

1. 变量和函数命名技巧,强烈推荐大家应该读一读的书 代码整洁之道,这本书我在大二读了前 3 个章节,代码质量就上升了好几个档次,给大家一些书中想法(自己还记得的,应该已经不是原文表述了):

  1. 变量名称要能恰当的表达他的意义。比如一个 int 是左边界,我会写成 left_boundary 而不是 lb;

  2. 函数应该只有最小运行过程,如果函数明中出现了 and,大部分情况可以分成两个函数;

  3. 函数的参数应该控制在较少的数量范围内,一个函数的参数如果太多,可以考虑把一些参数设计成一个类。

  4. 使用 Python 编写规范

比如可以尝试这样:

from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass
@dataclass
class InputFeatures:
    input_ids: List[int]
    attention_mask: Optional[List[int]] = None
    token_type_ids: Optional[List[int]] = None


def example_func(example_arg_a:str, example_arg_b: Dict = None) -> Tuple:
    """
    This is an example function for instruction
    :param example_arg_a: example argument a
    :param example_arg_b: example argument b
    :return: a data shoule be tuple type.
    """
    return (1,2)
  • InputFeatures 类中使用 dataclass 可以加快一个 class 的编写,加入 typing 的类型限制,可以帮助数据类型的设置,代码更易读懂,也节省了空间。

  • 如果 class 还有一些语法糖的意味在里面,那么函数 example_func 完全是一种费时费力的做法:

    • 首先在函数类型中确定了输入参数应有的类型,也描述了函数应该返回的类型。类型的限制结合一些 IDE 可以有效的帮助我们减少错误,因为 .py 文件在错误的地方会有异常的色块,帮助我们去检查错误。
    • 函数的描写中加入了详细的文档,可以有效地帮助读者了解这个函数的功能。文档是否是一定需要的呢?也并非如此,还是一句话,按需求,如果函数非常复杂,需要好好描述一下,那么可以加入。反之则不必。

TensorFlow 及相关框架

TensorFlow 与非常多库都有着关联和依赖,例如:NumPy 库、scipy 库、tensorboard 库等等。

这里我建议大家强烈学习 NumPy 库,因为 NumPy 和 TensorFlow 对于数据的处理有着强烈的依赖关系,而且可以简单互相转换。理解 NumPy 对矩阵的处理和运行,对于理解 TensorFlow 也是非常有帮助的。

这里大家还是按需出发,需要对矩阵进行什么操作就去学什么,问问搜索引擎。

我唯一自己学习过的 NumPy 基础就是唐宇迪老师的基础入门了,还是挺不错的。我觉得在 GitHub 的开源也能学的很好,唯一的技巧就是多尝试,多测试,多写,多想。

官方文档

这里推荐大家多查询官方文档,这是你真正唯一绝对正确的资料,如果有着不错的编程基础,完全可以通过文档中的样例来进行入门。

杂项

入门 TensorFlow 难免遇到非常多的问题以及困难,希望大家多思考,多尝试。这里给大家推荐一些我自己贯彻的原则和技巧,希望对大家有帮助。

  1. 提问的智慧-鸟哥 非常非常重要,可以帮助你们快速获取答案,同时一些思想可以应用到日常交流当中。

  2. 尝试去查找 StackOverflow、专门的社区例如 TensorFlow CSDN 社区官方文档 上的答案

  3. 日常关注技术动态,从点滴处进步:

    • TensorFlow 官方微信公众号 (TensorFlow_official):了解 TensorFlow 核心基础,获取最新的产品资讯和应用案例
    • 加入 TFUG(在公众号 TensorFlow 中回复 TFUG):在开源社区中找到更多志同道合的伙伴,在社区活动中获得提升
    • 知乎(谷歌开发者):分享实用技术资源
  4. 掌握多少尽量按照需求来,比如尽管算法实现的效率低了一点点,也不是最简洁的写法。但如果当前阶段只要正确实现,那么效率就并非是最需要让人担心的。在下一阶段如果效率需要是一个严重指标,那么再进一步优化特定模块。这样可以保证最小可使用产品原则。在保证正确的基础上,一步一步向前迭代。

  5. 保持谦逊、持续学习

最后

感谢 TensorFlow 社区的邀请,我做了一些粗略的总结,希望社区能够共同进步,我们都能在社区中汲取到知识。

本文由 TensorFlow 社区作者创作,文章已入选 “TensorFlow 开发者出道计划” 精选推荐,并由 TensorFlow CSDN 社区进行收录。

TensorFlow 联合 CSDN 重磅推出的 TensorFlow CSDN 社区内聚集沉淀了来自官方以及社区开发者的技术干货资源;更是一个供开发者们学习、提问,交流以及展出个人社区作品的平台。欢迎扫码关注,加入我们,在机器学习的道路上共同进步 !

中文:TensorFlow 公众号