TensorFlow 的入门资料整理与技巧

机器学习算法工程师

共 9615字,需浏览 20分钟

 ·

2021-01-05 15:55


点蓝色字关注“机器学习算法工程师

设为星标,干货直达!


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





写在开头:我与 TensorFlow 的故事

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


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


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


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

  1. 理论知识欠缺(对于模型的概念和细节不熟悉)

  2. 编程技巧欠缺(不知道如何模块化的编写程序和流程)

  3. 于 TensorFlow 及其依赖框架的不熟悉


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



理论知识

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


1.1 视频

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

  • deep learning
    https://www.coursera.org/specializations/deep-learning

  • machine learning
    https://www.coursera.org/learn/machine-learning

  • DeepLearning.AI TensorFlow Developer
    https://www.coursera.org/professional-certificates/tensorflow-in-practice


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

  • CSC321 Neural Networks for Machine Learning
    http://www.cs.toronto.edu/~hinton/coursera_lectures.html


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

  • CS224n: Natural Language Processing with Deep Learning
    http://cs224d.stanford.edu/


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

  • TensorFlow 入门实操课程
    https://www.icourse163.org/course/youdao-1460578162


1.2 书籍

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


此处不再过多推荐,基础在于牢固,概念在于理解,按需求去学习就好,感兴趣可以去看曾经整理的文章:
  1. 2019 年最佳机器学习和深度学习书籍的名单
    https://drogozhang.blog.csdn.net/article/details/104600594
  2. 15套免费的自然语言处理NLP课程及经典教材分享!
    https://drogozhang.blog.csdn.net/article/details/104601773
  3. 机器学习|深度学习|自然语言处理 学习数据/课程/资料/资源大分享
    https://drogozhang.blog.csdn.net/article/details/104601680


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



编程思维和技巧

编程是实现 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. 函数的参数应该控制在较少的数量范围内,一个函数的参数如果太多,可以考虑把一些参数设计成一个类。

  • 代码整洁之道
    https://book.douban.com/subject/4199741/

2. 使用 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
    https://tensorflow.google.cn/api_docs/python/tf/all_symbols
  • NumPy
    https://tensorflow.google.cn/guide/tf_numpy
  • HuggingFace
    https://huggingface.co/transformers/



杂项

入门 TensorFlow 难免遇到非常多的问题以及困难,希望大家多思考,多尝试。这里给大家推荐一些我自己贯彻的原则和技巧,希望对大家有帮助。
  1. 提问的智慧-鸟哥 非常非常重要,可以帮助你们快速获取答案,同时一些思想可以应用到日常交流当中。

    • 提问的智慧-鸟哥
      https://www.jianshu.com/p/ae389b2131ca?_wv=1031

  2. 尝试去查找 StackOverflow、专门的社区例如 TensorFlow CSDN 社区官方文档上的答案
    • TensorFlow CSDN 社区
      https://blog.csdn.net/tensorflowforum

    • 官方文档
      https://mp.weixin.qq.com/s/ecmK2SVnScP5lTRyEOpFYg

  3. 日常关注技术动态,从点滴处进步:
    • TensorFlow 官方微信公众号 (TensorFlow_official):了解 TensorFlow 核心基础,获取最新的产品资讯和应用案例

    • 加入 TFUG(公众号回复 TFUG):在开源社区中找到更多志同道合的伙伴,在社区活动中获得提升

    • 知乎(谷歌开发者):分享实用技术资源

    • 知乎(谷歌开发者)
      https://www.zhihu.com/column/c_1292161131210481664

    • Bilibili TensorFlow 官方频道:聚集官方入门视频教程和各个行业案例

    • Bilibili TensorFlow 官方频道
      https://space.bilibili.com/64169458/channel/detail?cid=41910

  4. 掌握多少尽量按照需求来,比如尽管算法实现的效率低了一点点,也不是最简洁的写法。但如果当前阶段只要正确实现,那么效率就并非是最需要让人担心的。在下一阶段如果效率需要是一个严重指标,那么再进一步优化特定模块。这样可以保证最小可使用产品原则。在保证正确的基础上,一步一步向前迭代。
  5. 保持谦逊、持续学习



最后

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




推荐阅读

PyTorch 源码解读之 torch.autograd

SWA:让你的目标检测模型无痛涨点1% AP

带你从零掌握迭代器及构建最简DataLoader

CondInst:性能和速度均超越Mask RCNN的实例分割模型

centerX: 用新的视角的方式打开CenterNet

mmdetection最小复刻版(十一):概率Anchor分配机制PAA深入分析

MMDetection新版本V2.7发布,支持DETR,还有YOLOV4在路上!

CNN:我不是你想的那样

TF Object Detection 终于支持TF2了!

无需tricks,知识蒸馏提升ResNet50在ImageNet上准确度至80%+

不妨试试MoCo,来替换ImageNet上pretrain模型!

重磅!一文深入深度学习模型压缩和加速

从源码学习Transformer!

mmdetection最小复刻版(七):anchor-base和anchor-free差异分析

mmdetection最小复刻版(四):独家yolo转化内幕


机器学习算法工程师


                                    一个用心的公众号


 




浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报