tensorflow with求导_3.4tensorflow2.x自动求导原理函数详解
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取:
1.1 tensorflow2.x自动求导
1.1.1 自动求导GradientTape类
GradientTape的作用就是用于自动求导,需要有自变量x和因变量y,调用gradient(y,x)就可以求导,在GradientTape定义的上下文中,会默认观察自变量x,并进行记录,需要占用内存等资源,所以可以精确指定观察变量,减少资源。自变量可以是多个,gradient(y,[x,p,g]) ,计算的结果就是多个变量的张量组合。也可以通过嵌套的方式实现高阶求导。
1.1.2 GradientTape类定义
class GradientTape(object):
(1)初始化构造函数
def __init__(self, persistent=False, watch_accessed_variables=True):
#persistent变量,默认情况下,调用一次求导之后,GradientTape所持有的资源就会被释放,不能再执行,如果需要持续求导,persistent默认为False,,也就是g只能调用一次,如果指定persistent为true,则可以多次求导。
#watch_accessed_variables,是否要指定观察的变量,默认为True,默认观察并记录上下文中的自变量,g.watch(x)可以不写,自动观察求导中的变量。如果要对监视变量进行精细控制,可以通过将watch_accessed_variables = False传递给tape,手动指定观察变量,避免全部观察记录,减少不必要的资源消耗。
实例
x = tf.Variable(2.0)
w = tf.Variable(5.0)
with tf.GradientTape(
watch_accessed_variables=False, persistent=True) as tape:
tape.watch(x)
y = x ** 2 # Gradients will be available for `x`.
z = w ** 3 # No gradients will be available as `w` isn't being watched.
dy_dx = tape.gradient(y, x)
print(dy_dx)
# No gradients will be available as `w` isn't being watched.
dz_dy = tape.gradient(z, w)
print(dz_dy)
(2)进入和退出函数
输入一个上下文,在该上下文中将操作记录在此tape上
def __enter__(self):
退出记录上下文,不再跟踪其他操作
def __exit__(self, typ, value, traceback):
(3)观察变量函数
指定观察变量,默认自动观察求导自变量,watch_accessed_variables = False时才需要手动指定。
def watch(self, tensor):
(1)停止在tape上记录操作
暂时停止在该tape上进行记录操作。此上下文管理器处于活动状态时执行的操作不会记录在tape上。这对于减少通过跟踪所有计算而使用的内存很有用。
def stop_recording(self):
实例:
import tensorflow as tf
x = tf.Variable(4.0)
with tf.GradientTape(persistent=True) as tape:
y = tf.pow(x, 2)
z=tape.gradient(y,x)
#with tape.stop_recording():# The gradient computation below is not traced, saving memory.
y+=x
dy_dx = tape.gradient(y, x)
print(z)
print(dy_dx)
输出结果:
tf.Tensor(8.0, shape=(), dtype=float32)
tf.Tensor(9.0, shape=(), dtype=float32)
如果加上stop_recording
import tensorflow as tf
x = tf.Variable(4.0)
with tf.GradientTape(persistent=True) as tape:
y = tf.pow(x, 2)
z=tape.gradient(y,x)
with tape.stop_recording():# The gradient computation below is not traced, saving memory.
y+=x
dy_dx = tape.gradient(y, x)
print(z)
print(dy_dx)
输出结果为
tf.Tensor(8.0, shape=(), dtype=float32)
None
可见stop_recording作用是停止记录变量的计算,不记录结果。求导结果为None;
(2)重置求导记录函数
清除此tape中存储的所有信息。等效于退出并重新进入tape上下文管理器。
def reset(self):
import tensorflow as tf
x=tf.Variable(initial_value=[1.,2.,3,])
with tf.GradientTape() as t:
loss = tf.pow(x,2)
with tf.GradientTape() as t:
loss += x;
z=t.gradient(loss, x) # Only differentiates other_loss_fn, not loss_fn
print(z)
# The following is equivalent to the above
with tf.GradientTape() as t:
loss = tf.pow(x,2)#调用了reset,这里的记录会被清除
#t.reset()注释,loss=x*x+x,不注释,会将x*x的记录清除,loss=x
loss += x
z=t.gradient(loss, x) # Only differentiates other_loss_fn, not loss_fn
print(z)
输出结果
tf.Tensor([1. 1. 1.], shape=(3,), dtype=float32)# 调用reset清除记录x*x
tf.Tensor([3. 5. 7.], shape=(3,), dtype=float32)# 不清除x*x
(6)返回观察的变量
该函数监视要求导的变量,可以是一个tensor[x],也可以是多个参数组成的列表[x,y],如果watch_accessed_variables定义为True,则可以不调用该函数,可以自动求导。
def watched_variables(self):
(7)求导函数
def gradient(self,
target,# 求导的函数y,可以理解为要求导的因变量y
sources,# 要对哪一个自变量x求导,可以是多个组合
output_gradients=None,求导后输出结果乘以的系数
unconnected_gradients=UnconnectedGradients.NONE):# 它是一个可选参数,有两个值,“none”和“zero”,none是它的默认值,表示当我们的target(因变量y)与sources(自变量x)之间没有关系时,返回NONE
(8)雅克比矩阵
在向量微积分中,雅可比矩阵是一阶偏导数以一定方式排列成的矩阵。
def jacobian(self,
target, #求导的函数y,可以理解为要求导的因变量y
sources,自变量x,维度大于等于2的张量
unconnected_gradients=UnconnectedGradients.NONE,
parallel_iterations=None,# 控制并行调度的迭代次数,可以用来控制总的内存使用量
experimental_use_pfor=True):
实例
with tf.GradientTape() as g:
x = tf.constant([[1., 2.], [3., 4.]], dtype=tf.float32)
g.watch(x)
y = x * x#一阶导数是2*x
batch_jacobian = g.batch_jacobian(y, x)
# batch_jacobian is [[[2, 0], [0, 4]], [[6, 0], [0, 8]]]
1.1.3 自动求导的步骤
(1)创建一个GradientTape对象:g=tf.GradientTape()
(2)监视watch要求导的变量:g.watch(x)
(3)对函数进行求导:g.gredient(y,x)
1.1.4 自动求导实例
(1)高阶导数嵌套实例
先初始化一个变量,然后定义变量的函数,然后用tf.GradientTape()求一阶导数和二阶导数。
import tensorflow as tf
#定义并初始化变量
x=tf.Variable(initial_value=[[1.,2.,3.],[4.,5.,6.]])
#创建GradientTape对象
with tf.GradientTape() as g1:
#指定观察变量
# g1.watch(x)
with tf.GradientTape(persistent=True) as g2:#嵌套高阶求导
# g2.watch(x)
y=x*x
z=tf.sqrt(y+1)
y1=g2.gradient(y,x)#一阶导数
z1x=g2.gradient(z,x)#z对于x的导数,因为g2的persistent参数设置为true,所以可以调用两次,否则报错。
y2=g1.gradient(y1,x)#二阶导数
print(y)
print(y1)
print(y2)
print(z1x)
输出结果:
tf.Tensor(
[[ 1. 4. 9.]
[16. 25. 36.]], shape=(2, 3), dtype=float32)
tf.Tensor(
[[ 2. 4. 6.]
[ 8. 10. 12.]], shape=(2, 3), dtype=float32)
tf.Tensor(
[[2. 2. 2.]
[2. 2. 2.]], shape=(2, 3), dtype=float32)
tf.Tensor(
[[0.70710677 0.8944272 0.94868326]
[0.97014254 0.9805807 0.9863939 ]], shape=(2, 3), dtype=float32)
(2)多变量和输出系数求导实例
import tensorflow as tf
x = tf.Variable(initial_value=[1.0, 2.0, 3.0])
y = tf.Variable(initial_value=[2.0, 4.0, 6.0])
with tf.GradientTape(persistent=True) as g:
g.watch(x)
g.watch(y)
z = tf.pow(x, 2) + tf.pow(y, 2)
output_gradients = tf.Variable([0.2, 0.6, 0.2])#输出结果相乘的系数
dz = g.gradient(z, [x, y], output_gradients=output_gradients) # 给每一个元素施加不同的权重
print(dz)
'''运行结果为:
[
dtype=float32)>,
dtype=float32)>]
'''
'''
本来的结果是dz_dx=[2,4,6], 分别乘以权重[0.2,0.6,0.2]之后,得到[0.4,2.4,1.2]
本来的结果是dz_dy=[4,8,12],分别乘以权重[0.2,0.6,0.2]之后,得到[0.8,4.8,2.4]
'''
1.1.5 参考文献
tensorflow with求导_3.4tensorflow2.x自动求导原理函数详解相关推荐
- numpy求矩阵的特征值与特征向量(np.linalg.eig函数详解)
numpy求矩阵的特征值与特征向量(np.linalg.eig) 语法 np.linalg.eig(a) 功能 Compute the eigenvalues and right eigenvecto ...
- [转载] 【全面总结】Tensorflow 2.0+与Keras的联系与应用(含model详解)
参考链接: Tensorflow 2.0的新功能 Tensorflow 2.0+与Keras的联系与应用(含model详解) 事实上我个人入坑tensorflow比较晚,于是导致我其实并没有经历Ten ...
- 计算机自动获取IP地址流程详解
计算机自动获取IP地址流程详解 你知道吗? 我们在日常生活中直接插上网线接口就可以直接上网,不需要拨号上网也不需要设置IP地址.那么我们在日常是怎么获得IP地址的呢? 这里就需要介绍一种服务是由Int ...
- PHP宽带自动拨号,window_Win10怎么设置宽带自动连接 win10开机自动连接宽带设置方法详解,对于没有使用路由器中转,每 - phpStudy...
Win10怎么设置宽带自动连接 win10开机自动连接宽带设置方法详解 对于没有使用路由器中转,每次开机都需要进行宽带连接拨号上网的用户来说,每次打开电脑都需要打开宽带连接进行拨号才能正常上网是不是很 ...
- php字段验证规则,ThinkPHP 自动验证及验证规则详解
ThinkPHP 自动验证及验证规则详解 ThinkPHP 自动验证 ThinkPHP 内置了数据对象的自动验证功能来完成模型的业务规则验证.自动验证是基于数据对象的,而大多情况下数据对象是基于 $_ ...
- Java自动日志监控框架auto-log详解
Java自动日志监控框架auto-log详解 1. 需求概述 2. auto-log简介 2.1 auto-log定义 2.2 auto-log目的 2.3 auto-log特性 2.4 注解说明 2 ...
- html自动求平均值,教大家Excel自动求平均值的函数公式教程
近日有关于Excel自动求平均值的函数公式教程的问题受到了很多网友们的关注,大多数网友都想要知道Excel自动求平均值的函数公式教程的具体情况,那么关于到Excel自动求平均值的函数公式教程的相关信息 ...
- 【TensorFlow】TFRecord数据集的制作:读取、显示及代码详解
在跑通了官网的mnist和cifar10数据之后,笔者尝试着制作自己的数据集,并保存,读入,显示. TensorFlow可以支持cifar10的数据格式, 也提供了标准的TFRecord 格式. te ...
- ❤️思维导图整理大厂面试高频数组: 两万字详解各种数组求和(建议收藏)❤️
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...
最新文章
- 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组
- MyBatis逆向工程:根据table生成Model、Mapper、Mapper.xml
- 中值滤波_Halcon联合C#编程自学笔记三之中值滤波
- Java程序员都要懂得知识点:原始数据类型
- mysql导出kml_谷歌地图如何导出kml文件 导出kml文件教程
- zencart 对首页静态化处理
- 计算机windows8黑屏怎么办,详解笔记本电脑出现电源拔出就黑屏的win8处理教程
- 接口配置锦囊妙计之三----端口自协商
- Php freeradius 认证,FreeRADIUS 配置认证记录入数据库
- win10下设置显示文件后缀名以及显示隐藏文件
- Word数学公式编辑器怎么用
- kali 安装volatility_linux网络命令 【Volatility】取证实战
- java基础-File类与IO流
- 快速开发 HTML5 交互式地铁线路图
- C++模板的特化与偏特化
- faststone capture注册码
- append html 是字符串,jquery .html()vs .append()
- Chatbot 分类
- 修炼内功——理解函数栈帧创建和销毁
- Raydium被盗造成巨额损失,但Zebec Protocol以及$ZBC并未受影响