Study Jam 进行中:从 0 到 1 ,简单粗暴上手 TensorFlow

机器学习 Study Jam 项目 上线半个月啦

很高兴有许多小伙伴加入我们

一起开始探索 TensorFlow 的旅程

同时,也友情提醒

进度没过半的同学

趁着假期,抓紧时间 get 知识点噢!!!

Study Jam 进行中:从 0 到 1 ,简单粗暴上手 TensorFlow_第1张图片

Study Jam 机器学习 之 TensorFlow 2 高效入门

本次课程的设计者是机器学习方向的谷歌开发者专家 (GDE) 李锡涵和李卓桓。本次课程由 TensorFlow User Group (TFUG) 与谷歌开发者社区 (GDG) 全程支持。


作为由 GDE 打造的 TensorFlow 中文课程,本课程包含机器学习的基本原理和应用。你将学到如何用 TensorFlow 构建神经网络,搭建基础模型,解决不同场景下的简单问题。课程答疑 (Office Hour) 将由 GDE 李锡涵和李卓桓分别进行。

以下,是我们在 上次 Office Hour 中收集到的一些问题与在直播过程中的回答:

1. TensorFlow 1.0 和 2.0 可以同时存在同时使用吗?

如果你想在一台电脑里同时存在 TensorFlow 1.x 和 2.0 版本的话,可以开两个 Conda 环境,一个 Conda 环境装 1.x 的版本,另一个 Conda 环境里面装 TensorFlow 2.0。

但如果说同时使用的话,其实好像没有什么必要。因为 TensorFlow 2.0 支持TensorFlow 1.x 的 API。可以直接在 TensorFlow 2.0 里面使用 tf.compat.v1 来使用 TensorFlow 1.x 的 API。

2. get-variable 弃用了吗?

在 TensorFlow 2 里面,我们是改用 tf.Variable,因为这种方式相对来讲是更符合 python 习惯的。要建立变量,直接实例化一个 Variable 类型的类就好了。而我们之前在 TF 1.X 里使用的 get_variable 其实是一个非常计算图式的写法,以上两种写法的理念是不太一样的。当然如果你实在是想用 get_variable,用 tf.compat.v1来调用 TF 1.x 的 API 也是可以用的,但是不建议大家这么使用。

同时,你会注意到 TensorFlow 2 和 TensorFlow 1.x 有非常多的区别。如果你没有用过 TensorFlow 1.x 的话,正好就不用担心。但是如果你是用过 TensorFlow 1.x 的,我之前在TensorFlow 官方公众号写了一篇叫《图执行模式下的 TensorFlow 2》,可以去看一下那篇文章,里面我专门介绍了如何能够比较顺利地从 TensorFlow 1.x 过渡到 TensorFlow 2。

3. 我想用现成的网络但是又想更改结构怎么弄?比如我要用现成的 inception 解决回归问题而不是分类,需要修改输入层和输出层。

我们先来理清一下你的需求。如果你是想用现成的网络结构,可能指的是直接通过 TensorFlow Hub 这样的服务。那里有很多已经训练好的模型,我可以直接把它下载下来,然后就可以直接运行,只不过与此同时,又想更改模型的结构。

解决方案是,TensorFlow Hub 提供了这样的灵活性。在下载模型的时候,可以只包含模型前面的层,不包含最后那一层,也就是 headless,最后一层你可以自己换以适应不同的用途。比方说我不是要分类,只想做回归的话,我就把这一层给换掉,再重新训练一下就可以了。

4. 有没有适合新手练习的署到手机的项目?

如果你比较关心的是在手机上面部署模型的话,TF Lite 官网上面有针对的教程,请访问:https://tensorflow.google.cn/lite/models 。或查看 tf.wiki 上的教程 https://tf.wiki/zh/deployment/lite.html

5. TensorFlow 对普通张量求导为什么是 null?必须要怎样定义才可以求导?

对于普通的 tensor 求导的话,现在 TensorFlow 是用 tf.GradientTape(也就是梯度带)这样的一个求导模式。其默认是只对 tf.Variable 这种变量类型求导,你如果直接去对其他的一些张量求导,肯定是求不出来的。要对普通张量求导的话,可以在 GradientTape 建立之后,使 tape.watch() 把你要求导的张量加到监视的列表里面去,然后就可以求导了。

我记得我之前在 TensorFlow 官方的公众号上面写了一篇文章《tf.GradientTape详解》。大家如果想看的话,可以直接在 TensorFlow 官方的公众号里输入“手册”两个字,就会发送给你整个连载的一个列表,里面有这样一篇文章,大家可以参考一下。

6. 使用 @tf.function 修饰后的 def 中无法使用 tensor.numpy() 转换为 numpy 数组,该如何将 tensor 转换为 numpy 的形式呢?

其实你需要注意到 tf.function 的本质是在做什么。它本质其实是把一个 Eager Execution 构造出来的计算过程全部转化成一个计算图。这个时候,你就必须要理解一下计算图这个东西是在做什么。计算图相当于一开始就把一个图构建好了,然后直接往里面输入数据。这也就是说, tf.function 不是什么东西都可以修饰,只有计算图模式下支持的操作才能转换。tensor.numpy() 这种操作是相当于把 tensor 里面的值取出来,这种操作在计算图的模式底下是没有的,因为你在声明计算图的时候没有值可以取。所以说你用 tf.function 也是没有办法给你转化这个东西的。如果你确实要把 tensor 转换成 numpy 数组的格式。方法是当你用 tf.function 修饰这个函数之后,把这个 tensor 作为返回的参数,这样当我调用这个函数,在参数里传入数据之后,返回值里面就可以有带值的 tensor,也就可以转换为 numpy 数组了。其实这个问题的本质还是计算图模式和即时执行的区别。

7. tf.keras 跟 Keras 的区别是什么?

Keras 的历史比较早的,至少在 2016 年以前就已经出现了,它是一个支持多种深度学习框架的上层 API,不仅仅适用于 TensorFlow。

而 tf.keras 不同,它是 TensorFlow 专有的,把 Keras 深度地整合到 TensorFlow 里面去,成为了 TensorFlow 的一个重要模块,主要是来支持高阶 API。以及还有一些 TensorFlow 的独有特性,比方说多机训练,也在 tf.keras 里得到了支持。

8. python 安装了 TensorFlow 后可以调用 TensorFlow Quantum 这个库吗?

要使用 TensorFlow Quantum 这个最近刚出的量子机器学习的库的话,你不仅要安装 TensorFlow,还要装 TensorFlow Quantum 这个独立的库,同时还要装一个 Google 的量子计算的一个框架 Cirq。也就是说,一共要安装三个库。

我在 tf.wiki 有一个简单的教程来介绍如何使用 TF Quantum:  https://tf.wiki/zh/appendix/quantum.html,可以参考一下里面的安装过程。

9. TensorFlow Lite 和 TensorFlow.js 的区别是?

区别很明显。TF Lite 主要是针对嵌入式的一些设备以及移动端。比方说你的手机的话,大家都知道手机的功耗和计算能力都比较受限,不像电脑中 GPU 随便就能到几百瓦,手机上就可怜的几瓦到十几瓦。所以说对性能的、功耗优化的要求比较高,不能计算量太大,但同时也希望推导模型的推理有一个比较好的性能。这时候就需要有 TF Lite,这个东西可以把我们已有的模型转换成一个相对来讲,对移动端对这种低功耗的设备更友好的一个格式,使得模型在移动端能够运行流畅。

然后 TF.js 可以简单理解为一个 JavaScript 底下的 TensorFlow,就是在 JavaScript 底下(比如浏览器)里面运行训练好的模型,或者在 Node.js 这样的服务器环境去跑。在去年 TensorFlow Dev Summit 大会上面就演示了一个非常有趣的东西。在浏览器上,你先用头像拍摄几张照片让模型去训练,随之通过你的头来控制吃豆人,接着来运行吃豆人的小游戏,这就是很典型的一个在浏览器里面运行的 TF.js 应用。 

10. 什么是 Graph(计算图)?

计算图就是我们在 TensorFlow 1.x 主要使用的模式,它是一个符号式的声明过程,相对而言对新手用户比较不友好。我做任何事情之前都要先建一个图。比方说现在要做一个加法,我有一个 A 等于 1,一个 B 等于 1,想要加起来得到一个 C 等于 2,那我怎么做?我不是说直接 C 等于 A+B 一加就可以,而是要先建一个计算图,先声明一个占位符叫做 A,再声明一个占位符叫做 B,然后再声明一个运算节点把 A 和 B 加起来得到一个 C。到这个地方为止,我还什么计算都没有做。然后接下来我开一个 session,然后把 A 和 B 这两个占位符和具体的值的对应关系输进去,比如说 A=1,B=1,然后 run 一下之后得到一个输出,这时候输出 C 就等于 2,其实 TensorFlow 在之前就是这样的一个模式,从占位符到中间加法运算,到最后得到 tensor 的值,这个过程就叫做Graph,也就是计算图。然后相对来讲对用户就不是特别友好。所以说在 TensorFlow 2 里面,我们就尽可能地淡化计算图的模式,不让大家显式地构建计算图了。

了解更多,请点击“阅读原文查看。

你可能感兴趣的:(Study Jam 进行中:从 0 到 1 ,简单粗暴上手 TensorFlow)