【机器学习炼丹术】的学习笔记分享

<<小白学PyTorch>>

扩展之Tensorflow2.0 | 19 TF2模型的存储与载入

扩展之Tensorflow2.0 | 18 TF2构建自定义模型

扩展之Tensorflow2.0 | 17 TFrec文件的创建与读取

扩展之Tensorflow2.0 | 16 TF2读取图片的方法

扩展之Tensorflow2.0 | 15 TF2实现一个简单的服装分类任务

小白学PyTorch | 14 tensorboardX可视化教程

小白学PyTorch | 13 EfficientNet详解及PyTorch实现

小白学PyTorch | 12 SENet详解及PyTorch实现

小白学PyTorch | 11 MobileNet详解及PyTorch实现

小白学PyTorch | 10 pytorch常见运算详解

小白学PyTorch | 9 tensor数据结构与存储结构

小白学PyTorch | 8 实战之MNIST小试牛刀

小白学PyTorch | 7 最新版本torchvision.transforms常用API翻译与讲解

小白学PyTorch | 6 模型的构建访问遍历存储(附代码)

小白学PyTorch | 5 torchvision预训练模型与数据集全览

小白学PyTorch | 4 构建模型三要素与权重初始化

小白学PyTorch | 3 浅谈Dataset和Dataloader

小白学PyTorch | 2 浅谈训练集验证集和测试集

小白学PyTorch | 1 搭建一个超简单的网络

小白学PyTorch | 动态图与静态图的浅显理解

参考目录:

  • 1 什么是eager模式

  • 2 TF1.0 vs TF2.0

  • 3 获取导数/梯度

  • 4 获取高阶导数

之前讲解了如何构建数据集,如何创建TFREC文件,如何构建模型,如何存储模型。这一篇文章主要讲解,TF2中提出的一个eager模式,这个模式大大简化了TF的复杂程度。

1 什么是eager模式

Eager模式(积极模式),我认为是TensorFlow2.0最大的更新,没有之一。

Tensorflow1.0的时候还是静态计算图,在《小白学PyTorch》系列的第一篇内容,就讲解了Tensorflow的静态特征图和PyTorch的动态特征图的区别。Tensorflow2.0提出了eager模式,在这个模式下,也支持了动态特征图的构建

不得不说,改的和PyTorch越来越像了,但是人类的工具总是向着简单易用的方向发展,这肯定是无可厚非的。

2 TF1.0 vs TF2.0

TF1.0中加入要计算梯度,是只能构建静态计算图的。

  1. 是先构建计算流程;

  2. 然后开始起一个会话对象;

  3. 把数据放到这个静态的数据图中。

整个流程非常的繁琐。

# 这个是tensorflow1.0的代码
import tensorflow as tf
a = tf.constant(3.0)
b = tf.placeholder(dtype = tf.float32)
c = tf.add(a,b)
sess = tf.Session() #创建会话对象
init = tf.global_variables_ini                            tializer()
sess.run(init) #初始化会话对象
feed = {b: 2.0
} #对变量b赋值
c_res = sess.run(c, feed) #通过会话驱动计算图获取计算结果
print(c_res)

代码中,我们需要用palceholder先开辟一个内存空间,然后构建好静态计算图后,在把数据赋值到这个被开辟的内存中,然后再运行整个计算流程。

下面我们来看在eager模式下运行上面的代码

import tensorflow as tf
a = tf.Variable(2)
b = tf.Variable(20)
c = a + b

没错,这样的话,就已经完成一个动态计算图的构建,TF2是默认开启eager模式的,所以不需要要额外的设置了。这样的构建方法,和PyTorch是非常类似的。

3 获取导数/梯度

假如我们使用的是PyTorch,那么我们如何得到的导数呢?

import torch
# Create tensors.
x = torch.tensor(10., requires_grad=True)
w = torch.tensor(2., requires_grad=True)
b = torch.tensor(3., requires_grad=True)
# Build a computational graph.
y = w * x + b    # y = 2 * x + 3
# Compute gradients.
y.backward()
# Print out the gradients.
print(x.grad)    # tensor(2.)
print(w.grad)    # tensor(10.)
print(b.grad)    # tensor(1.)

都没问题吧,下面用Tensorflow2.0来重写一下上面的内容:

import tensorflow as tf
x = tf.convert_to_tensor(10.)
w = tf.Variable(2.)
b = tf.Variable(3.)
with tf.GradientTape() as tape:z = w * x + b
dz_dw = tape.gradient(z,w)
print(dz_dw)
>>> tf.Tensor(10.0, shape=(), dtype=float32)

我们需要注意这几点:

  • 首先结果来看,没问题,w的梯度就是10;

  • 对于参与计算梯度、也就是参与梯度下降的变量,是需要用tf.Varaible来定义的;

  • 不管是变量还是输入数据,都要求是浮点数float,如果是整数的话会报错,并且梯度计算输出None;

  • tensorflow提供tf.GradientTape来实现自动求导,所以在tf.GradientTape内进行的操作,都会记录在tape当中,这个就是tape的概念。一个摄影带,把计算的过程录下来,然后进行求导操作

现在我们不仅要输出w的梯度,还要输出b的梯度,我们把上面的代码改成:

import tensorflow as tf
x = tf.convert_to_tensor(10.)
w = tf.Variable(2.)
b = tf.Variable(3.)
with tf.GradientTape() as tape:z = w * x + b
dz_dw = tape.gradient(z,w)
dz_db = tape.gradient(z,b)
print(dz_dw)
print(dz_db)

运行结果为:

这个错误翻译过来就是一个non-persistent的录像带,只能被要求计算一次梯度。 我们用tape计算了w的梯度,然后这个tape清空了数据,所有我们不能再计算b的梯度。

解决方法也很简单,我们只要设置这个tape是persistent就行了:

import tensorflow as tf
x = tf.convert_to_tensor(10.)
w = tf.Variable(2.)
b = tf.Variable(3.)
with tf.GradientTape(persistent=True) as tape:z = w * x + b
dz_dw = tape.gradient(z,w)
dz_db = tape.gradient(z,b)
print(dz_dw)
print(dz_db)

运行结果为:

4 获取高阶导数

import tensorflow  as tf
x = tf.Variable(1.0)
with tf.GradientTape() as t1:with tf.GradientTape() as t2:y = x * x * xdy_dx = t2.gradient(y, x)print(dy_dx)
d2y_d2x = t1.gradient(dy_dx, x)
print(d2y_d2x)
>>> tf.Tensor(3.0, shape=(), dtype=float32)
>>> tf.Tensor(6.0, shape=(), dtype=float32)

想要得到二阶导数,就要使用两个tape,然后对一阶导数再求导就行了。

- END -

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑

【小白学PyTorch】扩展之Tensorflow2.0 | 20 TF2的eager模式与求导相关推荐

  1. 【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则...

    [机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 扩展之Tensorflow2.0 | 20 TF2的eager模式与求导 扩展之Tensorflow2.0 | ...

  2. 【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(下)池化、Normalization

    <<小白学PyTorch>> 扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积.激活.初始化.正则 扩展之Tensorflow2.0 | 20 TF ...

  3. 【小白学PyTorch】16.TF2读取图片的方法

    <<小白学PyTorch>> 扩展之tensorflow2.0 | 15 TF2实现一个简单的服装分类任务 小白学PyTorch | 14 tensorboardX可视化教程 ...

  4. 【小白学PyTorch】18.TF2构建自定义模型

    [机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 扩展之Tensorflow2.0 | 17 TFrec文件的创建与读取 扩展之Tensorflow2.0 | 1 ...

  5. pytorch dataset_【小白学PyTorch】16.TF2读取图片的方法

    <> 扩展之tensorflow2.0 | 15 TF2实现一个简单的服装分类任务 小白学PyTorch | 14 tensorboardX可视化教程 小白学PyTorch | 13 Ef ...

  6. 小白学Pytorch系列-- Torch API (5)

    小白学Pytorch系列-- Torch API (5) Math operations Pointwise Ops TORCH.ABS 计算输入中每​​个元素的绝对值. >>> t ...

  7. 【小白学PyTorch】10.pytorch常见运算详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 <<小白学PyTorch>> 参考目录: ...

  8. 【小白学PyTorch】15.TF2实现一个简单的服装分类任务

    <<小白学PyTorch>> 小白学PyTorch | 14 tensorboardX可视化教程 小白学PyTorch | 13 EfficientNet详解及PyTorch实 ...

  9. 【小白学PyTorch】8.实战之MNIST小试牛刀

    <<小白学PyTorch>> 小白学PyTorch | 7 最新版本torchvision.transforms常用API翻译与讲解 小白学PyTorch | 6 模型的构建访 ...

最新文章

  1. ACE中的Proactor和Reactor
  2. 确定S中最接近中位数的k个元素(算法导论第三版9.3-7)
  3. MUI侧滑导航:页面组件(本地插件化)
  4. MyBatis 实现关联表查询
  5. [转载] Java的访问修饰符、非访问修饰符分类详细总结以及修饰符用途总结
  6. [Bzoj1911][Apio2010]特别行动队(斜率优化)
  7. 觅知网ppt模板_有哪些相见恨晚的PPT模板网站?
  8. 谷歌无法加载印象笔记剪辑插件
  9. 【QT】QCustomPlot图表控件
  10. c语言程序小时工资计算,C语言入门之工资计算
  11. 最好的关系,是彼此成就
  12. 虚拟存储器:页面置换算法
  13. uvalive 3713 2-sat
  14. C#Base64简单加密与解密
  15. [虚拟机保护] [原创]关于滴水的VT调试器
  16. 电脑重装详细步骤(win10)
  17. Oracle数据库之同义词(SYNONYM)使用(转)
  18. 最好用的设计稿实时预览工具【Sketch、Android App、iOS App】
  19. 字扩展,位扩展,字位扩展
  20. CSS如何动态下拉div盒子、移动div盒子和展开div盒子

热门文章

  1. ASP.NET页面揭秘之页面生命周期
  2. Core官方DI解析(2)-ServiceProvider
  3. 进阶面向对象——类的成员
  4. java工程中的.classpathaaaaaaaaaaaaaaaa转载
  5. Android 网络交互之MD5为什么要加盐
  6. error C1189: #error : WINDOWS.H already included. MFC apps must not #include windows.h
  7. python sorted下标_全!Python基础之原生数据类型、判断和循环、函数和文件操作合集...
  8. 毕业论文开题写作黄金法则
  9. JavaSE(二十三)——JVM
  10. 试编写小字典软件c程序,用tcc编译为trans.exe, 功能是读取文本文件in.txt,依据命令行参数输出对应查找结果