简单粗暴 TensorFlow(Xihan Li(雪麒))

简单粗暴TensorFlow | A Concise Handbook of TensorFlow

基于Eager Execution | Based on Eager Execution

在线阅读 | Read online : https://tf.wiki

备用地址 | Alternative URL:https://snowkylin.github.io/TensorFlow-cn/

作者 | Author: Xihan Li (snowkylin)

英文版译者 | Translators of English version: Zida Jin, Ming, Ji-An Li, Xihan Li

本手册是一篇精简的TensorFlow入门指导,基于TensorFlow的Eager Execution(动态图)模式,力图让具备一定机器学习及Python基础的开发者们快速上手TensorFlow。

This handbook is a concise introduction to TensorFlow based on Eager Execution mode, trying to help developers get started with TensorFlow quickly with some basic machine learning and Python knowledge.

PDF下载 | PDF download :

(中文版 | Chinese): https://www.tensorflowers.cn/t/6230
(英文版 | English): https://github.com/snowkylin/TensorFlow-cn/releases
在线答疑区 | Online Q&A area :

(中文 | Chinese): https://www.tensorflowers.cn/b/48
(英文 | English): https://github.com/snowkylin/TensorFlow-cn/issues

开始

基于 Eager Execution | Based on Eager Execution

本手册是一篇精简的 TensorFlow 入门指导,基于 TensorFlow 的 Eager Execution(动态图)模式,力图让 具备一定机器学习及 Python 基础的开发者们快速上手 TensorFlow。

友情提醒:如果发现阅读中有难以理解的部分,请检查自己对每章的“前置知识”部分是否有清楚的理解。

答疑区 - TensorFlow 中文社区“简单粗暴 TensorFlow”版面:https://www.tensorflowers.cn/b/48 (如果 您对本教程有任何疑问,请至 TensorFlow 中文社区的该版面发问) PDF 下载:https://www.tensorflowers.cn/t/6230 GitHub: https://github.com/snowkylin/TensorFlow-cn

This handbook is a concise introduction to TensorFlow based on TensorFlow’s Eager Execution mode, trying to help developers get started with TensorFlow quickly with some basic machine learning and Python knowledge.

Friendly reminder: If you find something difficult to understand in reading, please check if you have a clear understanding of the “Prerequisites”part of each chapter.

Q&A area - TensorFlow Chinese community “A Concise Handbook of TensorFlow”forum: https://www. tensorflowers.cn/b/48 (If you have any questions about this tutorial, please ask in this forum of the TensorFlow Chinese community) PDF download: https://www.tensorflowers.cn/t/6230

GitHub: https://github.com/snowkylin/TensorFlow-cn

1. 前言

2018 年 3 月 30 日,Google 在加州山景城举行了第二届 TensorFlow Dev Summit 开发者峰会,并宣布正 式发布 TensorFlow 1.8 版本。笔者有幸获得 Google 的资助亲临峰会现场,见证了这一具有里程碑式意义的 新版本发布。众多新功能的加入和支持展示了 TensorFlow 的雄心壮志,同时早在 2017 年秋就开始测试的 Eager Execution(动态图机制)在这一版本中终于正式加入,并成为了入门 TensorFlow 的官方推荐模式。

The easiest way to get started with TensorFlow is using Eager Execution. ——https://www.tensorflow.org/get_started/ 在此之前,TensorFlow 所基于的传统 Graph Execution 的弊端,如入门门槛高、调试困难、灵活性差、无法使 用 Python 原生控制语句等早已被开发者诟病许久。一些新的基于动态图机制的深度学习框架(如 PyTorch) 也横空出世,并以其易用性和快速开发的特性而占据了一席之地。尤其是在学术研究等需要快速迭代模型的 领域,PyTorch 等新兴深度学习框架已经成为主流。**笔者所在的数十人的机器学习实验室中,竟只有笔者一 人“守旧”地使用 TensorFlow。然而,直到目前,市面上相关的 TensorFlow 相关的中文技术书籍及资料仍 然基于传统的 Graph Execution 模式,让不少初学者(尤其是刚学过机器学习课程的大学生)望而却步。**由 此,在 TensorFlow 正式支持 Eager Execution 之际,有必要出现一本全新的技术手册,帮助初学者及需要 快速迭代模型的研究者,以一个全新的角度快速入门 TensorFlow。

同时,本手册还有第二个任务。市面上与 TensorFlow 相关的中文技术书籍大部分都以深度学习为主线,而 将 TensorFlow 作为这些深度学习模型的实现方式。这样固然有体系完整的优点,然而对于已经对机器学 习或深度学习理论有所了解,希望侧重于学习 TensorFlow 本身的读者而言,就显得不够友好。同时,虽然 TensorFlow 有官方的教学文档(https://tensorflow.google.cn/tutorials),然而在体例上显得逻辑性不足,缺 乏一般教学文档从浅入深,层次递进的特性,而更类似于一系列技术文档的罗列。于是,笔者希望编写一本 手册,以尽量精简的篇幅展示 TensorFlow 作为一个计算框架的主要特性,并弥补官方手册的不足,力图能 让已经有一定机器学习/深度学习知识及编程能力的读者迅速上手 TensorFlow,并在实际编程过程中可以随时查阅并解决实际问题。

本手册的主要特征有:

• 主要基于 TensorFlow 最新的 Eager Execution(动态图)模式,以便于模型的快速迭代开发。但依然 会包含传统的 Graph Execution 模式,代码上尽可能兼容两者;

• 定位以教学及工具书为主,编排以 TensorFlow 的各项概念和功能为核心,力求能够让 TensorFlow 开 发者快速查阅。各章相对独立,不一定需要按顺序阅读。正文中不会出现太多关于深度学习和机器学 习的理论介绍,但会提供若干阅读推荐以便初学者掌握相关基础知识;

• 代码实现均进行仔细推敲,力图简洁高效和表意清晰。模型实现均统一使用 TensorFlow 官方文档 最新 提出的继承 tf.keras.Model 和 tf.keras.layers.Layer 的方式(在其他技术文档中鲜少介绍),保 证代码的高度可复用性。每个完整项目的代码总行数均不过百行,让读者可以快速理解并举一反三;

• 注重详略,少即是多,不追求巨细靡遗和面面俱到,不进行大篇幅的细节论述。

在整本手册中,带“*”的部分均为选读。

A 本手册的暂定名称《简单粗暴 TensorFlow》是向我的好友兼同学 Chris Wu 编写的《简单粗暴 L T E X 》(https: A //github.com/wklchris/Note-by-LaTeX)致敬。该手册清晰精炼,是 L T E X 领域不可多得的中文资料,也是 我在编写这一技术文档时所学习的对象。本手册最初是在我的好友 Ji-An Li 所组织的深度学习研讨小组中, 由我作为预备知识的讲义而编写和使用。好友们的才学卓著与无私分享的品格也是编写此拙作的重要助力。

本手册的英文版由我的好友 Zida Jin(1-4 章)和 Ming(5-6 章)翻译,并由 Ji-An Li 和笔者审校。三位朋 友牺牲了自己的大量宝贵时间翻译和校对本手册,同时 Ji-An Li 亦对本手册的教学内容和代码细节提供了 诸多宝贵意见。我谨向好友们为本手册的辛勤付出致以衷心的感谢。

衷心感谢 Google 中国开发者关系团队和 TensorFlow 工程团队的成员们对本手册编写所提供的帮助。其中 包括开发者关系团队的 Luke Cheng 在本手册写作全程提供的思路启发和持续鼓励,开发者关系团队的 Rui Li, Pryce Mu 和 TensorFlow 社群维护的小伙伴们在本手册宣发及推广上提供的大力支持,以及 TensorFlow 团队的 Tiezhen Wang 在本手册工程细节方面提供的诸多建议和补充。

关于本手册的意见和建议,欢迎在 https://github.com/snowkylin/TensorFlow-cn/issues 提交。这是一个开 源项目,您的宝贵意见将促进本手册的持续更新。

2. TensorFlow 安装

TensorFlow 的最新安装步骤可参考官方网站上的说明(https://tensorflow.google.cn/install)。TensorFlow 支持 Python、Java、Go、C 等多种编程语言以及 Windows、OSX、Linux 等多种操作系统,此处及后文均 以主流的 Python 语言为准。 以下提供简易安装和正式安装两种途径,供不同层级的读者选用。

2.1 简易安装

如果只是安装一个运行在自己电脑上的,无需 GPU 的简易环境,不希望在环境配置上花费太多精力,建议按以下步骤安装(以 Windows 系统为例):

• 下载并安装 Python 集成环境 Anaconda (Python 3.6 版本);

• 下载并安装 Python 的 IDE PyCharm (Community 版本,或学生可申请 Professional 版本的免费授 权);

• 打开开始菜单中的“Anaconda Prompt”,输入 pip install tensorflow。 完毕。

2.1.1 Test

安装完毕后,我们来编写一个简单的程序来验证安装。

在命令行下输入 activate tensorflow 进入之前建立的安装有 TensorFlow 的 conda 环境,再输入 python 进入 Python 环境,逐行输入以下代码:

import tensorflow as tf

tf.enable_eager_execution()

A = tf.constant([[1, 2], [3, 4]]) B = tf.constant([[5, 6], [7, 8]]) C = tf.matmul(A, B)

print(C)

如果能够最终输出:

tf.Tensor( [[19 22] [43 50]], shape=(2, 2), dtype=int32)

说明 TensorFlow 已安装成功。运行途中可能会输出一些 TensorFlow 的提示信息,属于正常现象。

此处使用的是 Python 语言, 关于 Python 语言的入门教程可以参考 http://www.runoob.com/python3/ python3-tutorial.html 或 https://www.liaoxuefeng.com ,本手册之后将默认读者拥有 Python 语言的基本知识。不用紧张,Python 语言易于上手,而 TensorFlow 本身也不会用到 Python 语言的太多高级特性。关于 Python 的 IDE,建议使用 PyCharm 。如果你是学生并有.edu 结尾的邮箱的话,可以在 这里 申请免费 的授权。如果没有,也可以下载社区版本的 PyCharm,主要功能差别不大。

3. TensorFlow 基础

本章介绍 TensorFlow 的基本操作。 前置知识:

• Python 基本操作 (赋值、分支及循环语句、使用 import 导入库);

• Python 的 With 语句 ;

• NumPy ,Python 下常用的科学计算库。TensorFlow 与之结合紧密;

• 向量 和 矩阵 运算(矩阵的加减法、矩阵与向量相乘、矩阵与矩阵相乘、矩阵的转置等。

• 函数的导数 ,多元函数求导 (测试题:f(x, y) = x 2 + xy + y 2 , ∂f ∂x =?, ∂f ∂y =?);

• 线性回归 ;

• 梯度下降方法 求函数的局部最小值。

import tensorflow as tf

tf.enable_eager_execution()

a = tf.constant(1) b = tf.constant(1) c = tf.add(a, b)

print(c)

# 也可以直接写 c = a + b,两者等价

A = tf.constant([[1, 2], [3, 4]]) B = tf.constant([[5, 6], [7, 8]]) C = tf.matmul(A, B)

print(C)

输出:

tf.Tensor(2, shape=(), dtype=int32) 
tf.Tensor( [[19 22] [43 50]], shape=(2, 2), dtype=int32)

使用常规的科学计算库实现机器学习模型有两个痛点:

• 经常需要手工求函数关于参数的偏导数。如果是简单的函数或许还好,但一旦函数的形式变得复杂(尤 其是深度学习模型),手工求导的过程将变得非常痛苦,甚至不可行。

• 经常需要手工根据求导的结果更新参数。这里使用了最基础的梯度下降方法,因此参数的更新还较为 容易。但如果使用更加复杂的参数更新方法(例如 Adam 或者 Adagrad),这个更新过程的编写同样会 非常繁杂。

而 TensorFlow 等深度学习框架的出现很大程度上解决了这些痛点,为机器学习模型的实现带来了很大的便 利。

TensorFlow 的 Eager Execution(动态图)模式 与上述 NumPy 的运行方式十分类似,然而提供了更快速的运算(GPU 支持)、自动求导、优化器等一系列对深度学习非常重要的功能。以下展示了如何使用 TensorFlow 计算线性回归。可以注意到,程序的结构和前述 NumPy 的实现非常类似。这里,TensorFlow 帮助我们做了两件重要的工作:

• 使用 tape.gradient(ys, xs) 自动计算梯度;

• 使用 optimizer.apply_gradients(grads_and_vars) 自动更新模型参数。

a = tf.get_variable('a', dtype=tf.float32, shape=[], initializer=tf.zeros_initializer) b = tf.get_variable('b', dtype=tf.float32, shape=[], initializer=tf.zeros_initializer) variables = [a, b]

num_epoch = 10000 optimizer = tf.train.GradientDescentOptimizer(learning_rate=1e-3) for e in range(num_epoch):

# 使用 tf.GradientTape() 记录损失函数的梯度信息 with tf.GradientTape() as tape:

y_pred = a * X + b

loss = 0.5 * tf.reduce_sum(tf.square(y_pred - y)) # TensorFlow 自动计算损失函数关于自变量(模型参数)的梯度 grads = tape.gradient(loss, variables) # TensorFlow 自动根据梯度更新参数 optimizer.apply_gradients(grads_and_vars=zip(grads, variables))

在 这 里, 我 们 使 用 了 前 文 的 方 式 计 算 了 损 失 函 数 关 于 参 数 的 偏 导 数。 同 时, 使 用 tf.train. GradientDescentOptimizer(learning_rate=1e-3) 声明了一个梯度下降 优化器(Optimizer), 其学习率为 1e-3。优化器可以帮助我们根据计算出的求导结果更新模型参数,从而最小化某个特定的损失函数, 具体使用方式是调用其 apply_gradients() 方法。

注意到这里,更新模型参数的方法 optimizer.apply_gradients() 需要提供参数 grads_and_vars,即待更新的变量(如上述代码中的 variables )及损失函数关于这些变量的偏导数(如上述代码中的 grads )。 具体而言,这里需要传入一个 Python 列表(List),列表中的每个元素是一个(变量的偏导数,变量)对。 比如这里是 [(grad_w, w), (grad_b, b)] 。我们通过 grads = tape.gradient(loss, variables) 求出 tape 中记录的 loss 关于 variables = [w, b] 中每个变量的偏导数,也就是 grads = [grad_w, grad_b], 再使用 Python 的 zip() 函数将 grads = [grad_w, grad_b] 和 vars = [w, b] 拼装在一起,就可以组合出所需的参数了。

在实际应用中,我们编写的模型往往比这里一行就能写完的线性模型 y_pred = tf.matmul(X, w) + b 要 复杂得多。所以,我们往往会编写一个模型类,然后在需要调用的时候使用 y_pred = model(X) 进行调用。

4. TensorFlow 模型

关于模型类的编写方式可见下章。

本章介绍如

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值