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

2024-03-28 20:18

本文主要是介绍简单粗暴 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 tftf.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 tftf.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 + bloss = 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 模型

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

本章介绍如

这篇关于简单粗暴 TensorFlow(Xihan Li(雪麒))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/856599

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

docker-compose安装和简单使用

本文介绍docker-compose的安装和使用 新版docker已经默认安装了docker-compose 可以使用docker-compose -v 查看docker-compose版本 如果没有的话可以使用以下命令直接安装 sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-c

JavaFX环境的搭建和一个简单的例子

之前在网上搜了很多与javaFX相关的资料,都说要在Eclepse上要安装sdk插件什么的,反正就是乱七八糟的一大片,最后还是没搞成功,所以我在这里写下我搭建javaFX成功的环境给大家做一个参考吧。希望能帮助到你们! 1.首先要保证你的jdk版本能够支持JavaFX的开发,jdk-7u25版本以上的都能支持,最好安装jdk8吧,因为jdk8对支持JavaFX有新的特性了,比如:3D等;