TensorFlow 的入门资料整理与技巧
点蓝色字关注“机器学习算法工程师”
设为星标,干货直达!
今天为大家带来社区作者的精选推荐《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 个方面:
理论知识欠缺(对于模型的概念和细节不熟悉)
编程技巧欠缺(不知道如何模块化的编写程序和流程)
对于 TensorFlow 及其依赖框架的不熟悉
针对以上问题,全文贯彻一个思想:从需求出发。我想可以逐一出发,各个击破。
理论知识
理论作为深度学习时代必不可少的基础,如果要实现一些例如循环神经网络,卷积神经网络,Transformer 模块等等,概念的掌握是非常必要的。大家需要理解神经网络的本质就是一个输入输出的函数。对于一个神经网络,我们给定输入,等待他的输出就好了。这里给大家推荐一些入门的视频和书籍,可以有效地帮助大家理解概念。
1.1 视频
1. 吴恩达的深度学习视频,可以在 Coursera 上学习 deep learning 和 machine learning, 这是全网公认几乎最基础的深度学习入门课程了,需要的数学知识也非常非常的简单,就是基础的矩阵运算和微积分。现在还可以搭配 DeepLearning.AI TensorFlow Developer 课程,开始上手 TensorFlow 认证,看评价也很赞!
deep learning
https://www.coursera.org/specializations/deep-learningmachine learning
https://www.coursera.org/learn/machine-learningDeepLearning.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 书籍
-
《深度学习》by Ian Goodfellow, Yoshua Bengio, Aaron Courville -
《机器学习》 by 周志华 《统计学系方法(第二版)》by 李航
-
2019 年最佳机器学习和深度学习书籍的名单
https://drogozhang.blog.csdn.net/article/details/104600594
-
15套免费的自然语言处理NLP课程及经典教材分享!
https://drogozhang.blog.csdn.net/article/details/104601773
机器学习|深度学习|自然语言处理 学习数据/课程/资料/资源大分享
https://drogozhang.blog.csdn.net/article/details/104601680
大家注意一定要学练结合,不要试图把知识全部吃透理解了再去着手去写代码,投入产出比并不高,得不偿失。
编程思维和技巧
-
数据读取 -
训练 -
测试 模型的读取和存储
那么此时如何整理项目,如何编写一个合理、模块化的程序是非常有必要的,这能让程序错误更少,方便版本升级。还是一个原则:以可读性为前提,按需求出发。
如果程序某个模块异常的复杂,比如训练模型有非常多个方式,训练的过程也比较复杂,需要过几步做一次测试,测试要做什么准备。那么这时候,将 train 写成一个函数甚至是一个类,都是非常合理的。例如 huggingface 库就有 Trainer,拥有不同的训练超参数方便应对不同情况的训练。
2. 1. 如何培养
掌握类 Class,实例 Instance 等概念;
-
多阅读 GitHub 的项目文献开源的入门资料库中会有代码和运行过程,思考他们的设计思路,私以为有如下的几个级别: -
非常基础的入门资料,只有模型一个类,以 Jupyter Notebook 为存储格式,从头运行到尾。甚至函数也没几个; -
入门资料,编写了模型类,训练函数,测试函数的 Jupyter Notebook 文件; -
入门项目,将模型和数据读取等等分成了不同的 .py 文件进行处理; -
复杂项目,有非常细分的包和 .py 文件,对应了也许远程服务器展示,模型部署以及测试等等;
自己编写入门项目,按照曾经思考和运行的程序进行改写。
这里没有说级别有高低之分,一切都是需求出发,面向的人群和受众面不同,因此存储的格式不一样,大家还是按照自己的需求去看和学习。
2.2. 一些技巧
1. 变量和函数命名技巧,强烈推荐大家应该读一读的书代码整洁之道,这本书我在大二读了前 3 个章节,代码质量就上升了好几个档次,给大家一些书中想法(自己还记得的,应该已经不是原文表述了):
-
变量名称要能恰当的表达他的意义。比如一个 int 是左边界,我会写成 left_boundary 而不是 lb; -
函数应该只有最小运行过程,如果函数明中出现了 and,大部分情况可以分成两个函数; 函数的参数应该控制在较少的数量范围内,一个函数的参数如果太多,可以考虑把一些参数设计成一个类。
-
代码整洁之道
https://book.douban.com/subject/4199741/
比如可以尝试这样:
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/
杂项
提问的智慧-鸟哥 非常非常重要,可以帮助你们快速获取答案,同时一些思想可以应用到日常交流当中。
提问的智慧-鸟哥
https://www.jianshu.com/p/ae389b2131ca?_wv=1031-
尝试去查找 StackOverflow、专门的社区例如 TensorFlow CSDN 社区,官方文档上的答案 TensorFlow CSDN 社区
https://blog.csdn.net/tensorflowforum官方文档
https://mp.weixin.qq.com/s/ecmK2SVnScP5lTRyEOpFYg-
日常关注技术动态,从点滴处进步: TensorFlow 官方微信公众号 (TensorFlow_official):了解 TensorFlow 核心基础,获取最新的产品资讯和应用案例
加入 TFUG(公众号回复 TFUG):在开源社区中找到更多志同道合的伙伴,在社区活动中获得提升
知乎(谷歌开发者):分享实用技术资源
知乎(谷歌开发者)
https://www.zhihu.com/column/c_1292161131210481664Bilibili TensorFlow 官方频道:聚集官方入门视频教程和各个行业案例
Bilibili TensorFlow 官方频道
https://space.bilibili.com/64169458/channel/detail?cid=41910-
掌握多少尽量按照需求来,比如尽管算法实现的效率低了一点点,也不是最简洁的写法。但如果当前阶段只要正确实现,那么效率就并非是最需要让人担心的。在下一阶段如果效率需要是一个严重指标,那么再进一步优化特定模块。这样可以保证最小可使用产品原则。在保证正确的基础上,一步一步向前迭代。 -
保持谦逊、持续学习
最后
感谢 TensorFlow 社区的邀请,我做了一些粗略的总结,希望社区能够共同进步,我们都能在社区中汲取到知识。
推荐阅读
CondInst:性能和速度均超越Mask RCNN的实例分割模型
mmdetection最小复刻版(十一):概率Anchor分配机制PAA深入分析
MMDetection新版本V2.7发布,支持DETR,还有YOLOV4在路上!
无需tricks,知识蒸馏提升ResNet50在ImageNet上准确度至80%+
不妨试试MoCo,来替换ImageNet上pretrain模型!
mmdetection最小复刻版(七):anchor-base和anchor-free差异分析
mmdetection最小复刻版(四):独家yolo转化内幕
机器学习算法工程师
一个用心的公众号