当前位置: 首页 > 编程日记 > 正文

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         参考文献

相关文章:

WinRAR也能实现智能备份

日志 唐山郎¥ 一切随缘,顺其自然.加博友 关注他 最新日志 2012年意味着机会还是灾难墙壁网线插座的接法佛度有缘人我~想~你,但不。会找你asp.net"服务器应用程序不可超惊艳! 古装美女超精美剪辑该作者的其他文章 博主推荐 相关日志 随机阅读 首页推…

MediaCodeC解码视频指定帧,迅捷、精确

原创文章,转载请联系作者 若待明朝风雨过,人在天涯!春在天涯 原文地址 提要 最近在整理硬编码MediaCodec相关的学习笔记,以及代码文档,分享出来以供参考。本人水平有限,项目难免有思虑不当之处,…

threejs 绘制球体_ThreeJs 绘制点、线、面

所有的三位物体都是由点构成,两点构成线,三点构成面,ThreeJs又如何绘制出点、线、面呢 ?在ThreeJs中:模型由几何体和材质构成模型以何种形式(点、线、面)展示取决于渲染方式1. 几何体首先我们来创建一个自定义的几何体…

model多表操作

一. 创建模型 from django.db import models# Create your models here.#比较常用的作者信息放到这个表里面 class Author(models.Model): id models.AutoField(primary_keyTrue)namemodels.CharField(max_length32)agemodels.IntegerField()authorDetailmodels.OneToOneField…

cocos2d-x注意事项(十)Lua发展飞机战争-4-创建主角

二战中被称为二战飞机飞机,当然,以飞机作业。这是一个游戏,我们必须加入一个飞机——这是我们的英雄。 首先创建一个层(PlaneLayer)要显示飞机。然后,create飞机初始化方法 module("PlaneLayer",…

.PHONY makefile中的伪目标

拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令。 为了避免出现这个问题,需要.PHONY: clean所谓伪目标就是这样一个目标,它不代表一个真正的文件名&…

jq父级绑定事件的意义_jq——事件

$(document),$(body)加载事件:$(document).ready(fn)$(document).ready(function(){ alert("这是加载事件"); });简写:$(function(){});工作中简写比较多js:window.οnlοadfn 把页面上的DOM和资源加载完成之后执行jq:$(document).ready(fn)…

美妆彩妆宣传PPT模板

还有四天就是三八妇女节了,相信有不少从事美妆美容行业的工作者也要开始对产品的一个宣传简介了,对外进行一番交流配上一份优秀的PPT模板是再好不过的了。今天办公资源要和大家分享的PPT模板是可用于美妆美容美发行业的工作策划,总结汇报等。…

报表性能优化方案之报表服务器优化基础讲解

内存 JVM堆栈内存是决定应用服务器性能的关键指标,一般服务器默认的内存配置都比较小,在较大型的应用项目中,这点内存是不够的,因此需要进行查看与修改Web服务器内存大小,接下来就介绍服务器内存查看的方法以及不同服务…

windows下git bash乱码问题

网上有很多相关资料,备份一下: 1,/etc/gitconfig:[gui] encoding utf-8 #代码库统一用urf-8,在git gui中可以正常显示中文[i18n] commitencoding GB2312 #log编码,window下默认gb2312,声明后发到服务器才不会乱码[svn] …

python tcp server分包_如何创建线程池来监听tcpserver包python

我试图创建线程池来同时对传入的tcp包执行一些操作。在我在python3中找不到任何内置线程池。我也读了一些关于multiprocessing.Pool的文章,但是它不支持内存共享。所以我使用Queue来模拟线程池。在为每个线程创建一个队列是否更好?有没有人有建议或更好的…

R语言 股价分析

首先判断股价的分布是不是正态分布: #获取3m公司收盘价 mmmdata read.csv("E:\\kuaipan\\A Introduction to Analysis of Financial Data with R\\chapter 1\\ch1data\\d-mmm-0111.txt",header T) mmmprice as.numeric(sapply(mmmdata, function(l){substring(l,1…

JavaのFile类基础操作之问题

在上一章节,介绍了File类的基础操作,比如文件的创建,文件的删除等等。这一章节,将介绍在File类基础操作中遇到的问题。 1.路径分割符问题 在实际的软件开发与运行过程中,往往都会在Windows环境下进行项目的开发&#x…

把时间当作朋友(第一版)笔记

平生第一次下载并阅读了电子版的关于学习类型的书籍,并且用软件(MindManager)记录了读书摘要(其实最多能叫摘录),不过也不妨碍我发篇随笔记录下。 平常,我更喜欢读纸质的书籍,用日志本记录笔记&…

python中执行linux命令(调用linux命令)_Python调用Linux bash命令

import subprocess as sup # 以下注释很多(为了自己以后不忘), 如果只是想在python中执行Linux命令, 看前5行就够了# 3.5版本之后官方推荐使用sup.run()sup.run("ls -l", shellTrue) # 如果参数args是字符串, shell要设置为Truesup.run(("ls", "-l&…

IOS中CoreLocation框架地理定位

1.CoreLocation框架使用前提&#xff1a; #import <CoreLocation/CoreLocation.h> CoreLocation框架中所有数据类型的前缀都是CL &#xff0c;CoreLocation中使用CLLocationManager对象来做用户定位 2.CLLocationManager的常用操作&#xff1a; 开始用户定位 - (void)sta…

Your First Concordion.Net Project (Part 5)-Running Specs with Gallio

http://living-in-concordion.blogspot.com/2009/05/your-first-concordionnet-project-part-5.html 需要一些自动运行Spec的Runner&#xff0c;这里采用的为Gallio写的一个插件。 Gallio是一个开源的测试框架&#xff0c;能够运行各种.net的测试框架&#xff0c;具有较高的扩展…

Vue学习的路径

接下来我将正式学习Vue,根据Vue作者所给的学习路径进行学习。每天做好学习笔记。​ vue学习路径和建议----尤雨溪 ​ vue官网

ssh mysql环境搭建 myeclipse_MyEclipse整合ssh三大框架环境搭载用户注册源码下载

前言SSH不是一个框架&#xff0c;而是多个框架(strutsspringhibernate)的集成&#xff0c;是目前较流行的一种Web应用程序开源集成框架&#xff0c;用于构建灵活、易于扩展的多层Web应用程序。集成SSH框架的系统从职责上分为四层&#xff1a;表示层、业务逻辑层、数据持久层和域…

IIS7.5 HTTP 错误 500 调用loadlibraryex失败的解决方法

在IIS7.5打开网页的时候&#xff0c;提示&#xff1a; HTTP 错误 500.0 - Internal Server Error 调用 LoadLibraryEx 失败&#xff0c;在 ISAPI 筛选器 C:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.dll,经过排除发现原来是两个斜杠导致在IIS7.5打开网页的时…

Android学习笔记之progressBar(进度条)

一、说明 <1>在某项延续性工作的进展过程中为了不让用户觉得程序死掉了&#xff0c;需要有个活动的进度条&#xff0c;表示此过程正在进行中。 <2>在某些操作的进度中的可视指示器&#xff0c;为用户呈现操作的进度&#xff0c;还它有一个次要的进度条&#xff0c;…

在hadoop上运行python_hadoop上运行python程序

数据来源&#xff1a;http://www.nber.org/patents/acite75_99.zip首先上传测试数据到hdfs&#xff1a;[rootlocalhost:/usr/local/hadoop/hadoop-0.19.2]#bin/hadoopfs -ls /user/root/test-inFound 5 items-rw-r--r-- 1root supergroup101 2010-10-24 14:39 /user/root/test-…

leetcode 237: Delete Node in a Linked List

题目&#xff1a; Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become…

一次奇怪的AP注册异常问题处理

很久没遇到值得分享的经验&#xff0c;今天遇到一个问题&#xff0c;处理过程很有意思&#xff0c;和大家一起分享一下。有一个客户部署华三的一套无线&#xff0c;采用控制器瘦AP的方式。部署过程都是轻车熟路&#xff0c;配置全部完成&#xff0c;静等AP上线&#xff0c;这时…

今天是第一次开博客,for--futurechild!!!

今天刚刚开了一个博客&#xff0c;或许觉得每一个比较牛叉的人都会经历一个不平凡的过程。通往高手之路是一个及其不平凡的路途。学校教育不能培养出真正高手。学习的最高境界是---悟。自己一步一个脚印最终能到达高手的殿堂。当然&#xff0c;我也希望能记录下自己的这个过程。…

memcache php mysql_PHP中的数据库二、memcache

在一个高并发的web应用中&#xff0c;数据库存取瓶颈一直是个大问题&#xff0c;一旦达到某个极限&#xff0c;数据库很容易崩溃&#xff0c;但是如果我们把常用的数据放到内存中&#xff0c;在需要的时候从内存中取&#xff0c;不光读取速度快&#xff0c;而且节约数据库IO。m…

JavaScript sync and async(同步和异步)

推荐四篇文章&#xff1a; JavaScript 是单线程的深入分析JavaScript 运行机制详解&#xff1a;再谈 Event LoopJavaScript 异步编程的4种方法JavaScript 既是单线程又是异步的&#xff0c;请问这二者是否冲突&#xff0c;以及有什么区别&#xff1f;一个重要前提&#xff1a;J…

掌握 MySQL 这 19 个骚操作,效率至少提高3倍

本文我们来谈谈项目中常用的MySQL优化方法&#xff0c;共19条&#xff0c;利用好这19条方法&#xff0c;会让你的效率提升至少3倍。1、EXPLAIN做MySQL优化&#xff0c;我们要善用EXPLAIN查看SQL执行计划。下面来个简单的示例&#xff0c;标注&#xff08;1、2、3、4、5&#xf…

对于PS和flash协作做过光字的一点心得

上次一个朋友要求要帮忙帮他网站BANNER上面做个透明的过光字FLASH&#xff0c;要求必须是PS处理的字的效果再用过光字做成FLASH。。。 导入PS生成的文字效果PNG透明图片&#xff0c;直接新建图层&#xff0c;放下面&#xff0c;画个过光的效果&#xff0c;结果没有过光效果&…

mysql 5.6 binlog_format_ROW 格式binlog 在MySQL5.6上的数据恢复实验

5.6和5.7版本的MySQL&#xff0c;有个参数binlog_row_image&#xff0c;默认值为FULL&#xff0c;表示记录的是全部的binlog操作日志(仅在binlog_formatROW时候生效)。此外binlog_row_image还可以是minimal&#xff0c;表示binlog记录的就只是影响后的行。如此一来使用ROW格式就…