【资料推荐】TensorFlow的入门资料整理与技巧

TensorFlow的入门资料整理与技巧

我与TensorFlow的故事

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

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

我希望解决的问题是:“如何快速且正确地使用TensorFlow上按自己想法实现深度学习模型“

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

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

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

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

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

1. 理论知识

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

1.1 视频

  1. 吴恩达的深度学习视频,可以在coursera上学习deep learningmachine learning, 这是全网几乎最公认最基础的深度学习入门课程了,需要的数学也非常非常的简单,就是基础的矩阵运算和微积分。现在还搭配DeepLearning.AI TensorFlow Developer课程,看评价也很赞!
  2. 深度学习之父,图灵奖作者Hinton的课程csc321 Neural Networks for Machine Learning,多伦多大学的神经网络机器学习课程,早期是由Hinton本人上课,需要有一定的基础。
  3. 斯坦福大学教授Chris Manning 的课程CS224n: Natural Language Processing with Deep Learning,专注于自然语言处理(夹带私货,hhhh)
  4. TensorFlow实用课程:《TensorFlow 入门实操课程》

1.2 书籍

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

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

  1. 2019 年最佳机器学习和深度学习书籍的名单

  2. 15套免费的自然语言处理NLP课程及经典教材分享!

  3. 机器学习|深度学习|自然语言处理 学习数据/课程/资料/资源大分享

以及TensorFlow官方的整理合集:

  1. TensorFlow官网教育资源

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

2. 编程思维和技巧

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

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

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

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

2. 1. 如何培养

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

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

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

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

2.2. 一些技巧

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

    • 变量名称要能恰当的表达他的意义。比如一个int是左边界,我会写成left_boundary而不是lb
    • 函数应该只有最小运行过程,如果函数明中出现了and,大部分情况可以分成两个函数。
    • 函数的参数应该控制在较少的数量范围内,一个函数的参数如果太多,可以考虑把一些参数设计成一个类
  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文件在错误的地方会有异常的色块,帮助我们去检查错误。
      • 函数的描写中加入了详细的文档。可以有效的帮助读者了解这个函数的功能。是否文档是一定必要的呢?也并非如此,还是一句话,按需求,如果函数非常复杂,需要好好描述一下,那么可以加入。反之则不必。

3. TensorFlow及相关框架

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

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

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

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

3.1 官方文档

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

  1. TensorFlow
  2. Numpy
  3. HuggingFace
  4. TensorFlow入门教程

4. 杂项

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

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

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

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

    ● TensorFlow 官方微信公众号(TensorFlow_official):了解 TensorFlow 核心基础,获取最新的产品资讯和应用案例

    加入 TFUG:在开源社区中找到更多志同道合的伙伴,在社区活动中获得提升

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

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

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

  5. 保持谦逊、持续学习

最后

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章