tensorflow学习笔记(三十):tf.gradients 与 tf.stop_gradient() 与 高阶导数

2023-11-07

gradient

tensorflow中有一个计算梯度的函数tf.gradients(ys, xs),要注意的是,xs中的x必须要与ys相关,不相关的话,会报错。
代码中定义了两个变量w1w2, 但res只与w1相关

#wrong
import tensorflow as tf

w1 = tf.Variable([[1,2]], dtype=tf.float32)
w2 = tf.Variable([[3,4]], dtype=tf.float32)

res = tf.matmul(w1, tf.convert_to_tensor([[2],[1]], dtype=tf.float32))

grads = tf.gradients(res,[w1,w2])

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    re = sess.run(grads)
    print(re)

错误信息
TypeError: Fetch argument None has invalid type <class ‘NoneType’>

# right
import tensorflow as tf

w1 = tf.Variable([[1, 2]], dtype=tf.float32)
w2 = tf.Variable([[3, 4]], dtype=tf.float32)

res = tf.matmul(w1, tf.convert_to_tensor([[2], [1]],dtype=tf.float32))

grads = tf.gradients(res, [w1])
print(grads)

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    re = sess.run(grads)
    print(re)
#  [array([[2, 1]], dtype=int32)]

对于grad_ys的测试:

import tensorflow as tf

w1 = tf.get_variable('w1', shape=[3])
w2 = tf.get_variable('w2', shape=[3])

w3 = tf.get_variable('w3', shape=[3])
w4 = tf.get_variable('w4', shape=[3])

z1 = w1 + w2+ w3
z2 = w3 + w4

grads = tf.gradients([z1, z2], [w1, w2, w3, w4], grad_ys=[tf.convert_to_tensor([2.,2.,3.]),
                                                          tf.convert_to_tensor([3.,2.,4.])])

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(grads))
[array([ 2.,  2.,  3.],dtype=float32),
 array([ 2.,  2.,  3.], dtype=float32), 
 array([ 5.,  4.,  7.], dtype=float32), 
 array([ 3.,  2.,  4.], dtype=float32)]
  • 可以看出,grad_ys 代表的是 ys 的头梯度

tf.stop_gradient()

阻挡节点BP的梯度

import tensorflow as tf

w1 = tf.Variable(2.0)
w2 = tf.Variable(2.0)

a = tf.multiply(w1, 3.0)
a_stoped = tf.stop_gradient(a)

# b=w1*3.0*w2
b = tf.multiply(a_stoped, w2)
gradients = tf.gradients(b, xs=[w1, w2])
print(gradients)
#输出
#[None, <tf.Tensor 'gradients/Mul_1_grad/Reshape_1:0' shape=() dtype=float32>]

可见,一个节点stop之后,这个节点上的梯度,就无法再向前BP了。由于w1变量的梯度只能来自a节点,所以,计算梯度返回的是None

a = tf.Variable(1.0)
b = tf.Variable(1.0)

c = tf.add(a, b)

c_stoped = tf.stop_gradient(c)

d = tf.add(a, b)

e = tf.add(c_stoped, d)

gradients = tf.gradients(e, xs=[a, b])

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(gradients))
#输出 [1.0, 1.0]

虽然 c节点被stop了,但是a,b还有从d传回的梯度,所以还是可以输出梯度值的。

import tensorflow as tf

w1 = tf.Variable(2.0)
w2 = tf.Variable(2.0)
a = tf.multiply(w1, 3.0)
a_stoped = tf.stop_gradient(a)

# b=w1*3.0*w2
b = tf.multiply(a_stoped, w2)

opt = tf.train.GradientDescentOptimizer(0.1)

gradients = tf.gradients(b, xs=tf.trainable_variables())

tf.summary.histogram(gradients[0].name, gradients[0])# 这里会报错,因为gradients[0]是None
#其它地方都会运行正常,无论是梯度的计算还是变量的更新。总觉着tensorflow这么设计有点不好,
#不如改成流过去的梯度为0
train_op = opt.apply_gradients(zip(gradients, tf.trainable_variables()))

print(gradients)
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(train_op))
    print(sess.run([w1, w2]))

高阶导数

tensorflow 求 高阶导数可以使用 tf.gradients 来实现

import tensorflow as tf

with tf.device('/cpu:0'):
    a = tf.constant(1.)
    b = tf.pow(a, 2)
    grad = tf.gradients(ys=b, xs=a) # 一阶导
    print(grad[0])
    grad_2 = tf.gradients(ys=grad[0], xs=a) # 二阶导
    grad_3 = tf.gradients(ys=grad_2[0], xs=a) # 三阶导
    print(grad_3)

with tf.Session() as sess:
    print(sess.run(grad_3))

Note: 有些 op,tf 没有实现其高阶导的计算,例如 tf.add …, 如果计算了一个没有实现 高阶导的 op的高阶导, gradients 会返回 None。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow学习笔记(三十):tf.gradients 与 tf.stop_gradient() 与 高阶导数 的相关文章

  • TensorFlow CUDA_ERROR_OUT_OF_MEMORY

    我正在尝试在 TensorFlow 中构建一个大型 CNN 并打算在多 GPU 系统上运行它 我采用了 塔式 系统 并为两个 GPU 拆分批次 同时将变量和其他计算保留在 CPU 上 我的系统有 32GB 内存 但是当我运行代码时出现错误
  • 张量流中有哪些资产?

    我正在阅读有关保存和恢复模型的张量流教程 并遇到以下声明 If assets need to be saved and written or copied to disk they can be provided when the firs
  • 监控培训课程如何运作?

    我试图理解使用之间的区别tf Session and tf train MonitoredTrainingSession 以及我可能更喜欢其中之一 似乎当我使用后者时 我可以避免许多 杂务 例如初始化变量 启动队列运行程序或设置文件编写器以
  • keras LSTM 以正确的形状提供输入

    我从具有以下形状的 pandas 数据框中获取一些数据 df head gt gt gt Value USD Drop 7 Up 7 Mean Change 7 Change Predict 0 06480 2 0 4 0 0 000429
  • Keras:加载多个模型并在不同线程中进行预测

    我正在使用带有张量流核心的 Keras 我想在构造函数中加载 2 个不同的模型 然后在不同的线程中进行预测 根据请求 我尝试在张量流图上下文中加载这些模型 但它不起作用 我的代码 from keras models import load
  • 如何在nodejs(tensorflow.js)中训练模型?

    我想做一个图像分类器 但我不会python Tensorflow js 使用我熟悉的 javascript 可以用它来训练模型吗 训练步骤是什么 坦白说 我不知道从哪里开始 我唯一想到的是如何加载 mobilenet 它显然是一组预先训练的
  • 从 [tensorflow 1.00] 中的 softmax 层提取概率

    使用张量流 我有一个 LSTM 分类模型 以 softmax 作为最终节点 这是我的 softmax 层 with tf name scope Softmax as scope with tf variable scope Softmax
  • ValueError:形状(无,50)和(无,1)在 Tensorflow 和 Colab 中不兼容

    我正在使用 LSTM 训练 Tensorflow 模型以进行预测维护 对于每个实例 我创建一个矩阵 50 4 其中 50 是历史序列的长度 4 是每个记录的特征数量 因此为了训练模型 我使用例如 55048 50 4 张量和 55048 1
  • Tensorboard 和 Dropout 层

    我有一个非常基本的查询 我制作了 4 个几乎相同 差异在于输入形状 的 CNN 并在连接到全连接层的前馈网络时合并了它们 几乎相同的 CNN 的代码 model3 Sequential model3 add Convolution2D 32
  • AttributeError:模块“keras.engine”没有属性“Layer”

    当我试图运行时Parking Slot mask rcnn py文件我收到如下错误mrcnn model py文件我该如何解决 gt 2021 06 17 08 25 18 585897 W tensorflow stream execut
  • 通过 cmake 使用预编译的张量流

    我已经建立了一个 C 项目CLion使用CMake 我正在使用各种第三方库 并且还想集成张量流 我试过了bazel编译张量流到共享库libtensorflow so哪种工作有效 但是仍然有相当多的依赖项 例如当前的 protobuf 版本
  • 从字符串列表创建 TfRecords 并在解码后在张量流中提供图形

    目的是创建 TfRecords 数据库 给定 我有 23 个文件夹 每个文件夹包含 7500 个图像 以及 23 个文本文件 每个文件有 7500 行描述单独文件夹中 7500 个图像的特征 我通过以下代码创建了数据库 import ten
  • 将 Pytorch 模型 .pth 转换为 onnx 模型

    我有一个预训练的模型 其格式为 pth 扩展名 我想将其转换为 Tensorflow protobuf 但我没有找到任何方法来做到这一点 我见过 onnx 可以将模型从 pytorch 转换为 onnx 然后从 onnx 转换为 Tenso
  • AttributeError:模块“tensorflow.python.framework.ops”没有属性“RegisterShape”

    我正在使用 TensorFlow 2 1 0 dev20191125 不幸的是 我无法编译一个带有错误的简单示例 AttributeError 模块 tensorflow python framework ops 没有 属性 Registe
  • Keras:binary_crossentropy 和 categorical_crossentropy 混淆

    使用 TensorFlow 一段时间后 我阅读了一些 Keras 教程并实现了一些示例 我找到了几个使用卷积自动编码器的教程keras losses binary crossentropy作为损失函数 我想binary crossentro
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 交换keras中的张量轴

    我想将图像批次的张量轴从 batch size row col ch 交换为 批次大小 通道 行 列 在 numpy 中 这可以通过以下方式完成 X batch np moveaxis X batch 3 1 我该如何在 Keras 中做到
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe
  • Keras CNN 回归模型损失低,准确度为 0

    我在 keras 中遇到这个 NN 回归模型的问题 我正在研究一个汽车数据集 以根据 13 个维度预测价格 简而言之 我已将其读取为 pandas 数据帧 将数值转换为浮点数 缩放值 然后对分类值使用 one hot 编码 这创建了很多新列
  • Tensorflow Eager Execution 不适用于学习率衰减

    在这里尝试让一个热切的执行模型与 LR 衰减一起工作 但没有成功 这似乎是一个错误 因为学习率衰减张量似乎没有更新 如果我遗漏了什么 你可以帮我一下吗 谢谢 下面的代码正在学习一些词嵌入 但是 那学习率衰减部分根本不起作用 class Wo

随机推荐

  • RabbitMQ优秀博文整理

    1 关于主流MQ的介绍 各MQ的优缺点 MQ的使用选举等 MQ消息队列详解 四大MQ的优缺点分析 从百草园杀到三味书屋 的博客 CSDN博客 几种消息队列的优缺点 2 RabbitMQ常见问题的整理 以及解决思路 图文并茂 比较详细 Rab
  • shell脚本执行sql文件及语句

    由于经常操作数据库 遇到频繁建表 加字段 索引 修改数据等问题 大多是操作多个数据库 sql文件或语句不固定 最后选择shell脚本来执行 eg 1 多库建相同的表 bin bash host 127 0 0 1 dbUser root d
  • STM32F7上移植NES游戏

    上面是我的微信和QQ群 欢迎新朋友的加入 说不上是原创 因为核心程序是别人的 我只是移植过来 让它适应我手上这个版本的库函数 一共是四个小游戏 我自己只会玩一个坦克大战和经典的超级玛丽 坦克大战截图 不知道是什么游戏 硬件平台 STM32F
  • 数据库查询内容制成新表group_concat报错“Row XXX was cut by group_concat”的解决

    MySql数据库查询时 使用group concat报错 Row XXX was cut by GROUP CONCAT 单独查询不会报错 当我要将查询的数据制作成新表时 会报这个错 网上查了下是因为group concat有个最大长度的限
  • 2014阿里巴巴9月15哈尔滨校园招聘笔试题及答案

    from http blog csdn net lingfengtengfei article details 12344711
  • 控制台输入python后报错

    解决方法 可以 进入到该目录 Anaconda3 Lib site packages pyreadline lineeditor history py文件的第82行 修改如下 for line in open filename r enco
  • Servlet文件上传实现进度条提示-实测+源码下载

    1 案例概述 本案例技术站 servlet jQuery实现 1 1 案例效果展示 1 2 案例说明 1 实现文件上传 2 实现文件上传时出现进度条提示 上传结束时进度条消失 3 通过监听和session共享的方式获取文件上传的实时信息 4
  • HashBasedTable用法实例

    import com google common collect HashBasedTable import com google common collect Table import java util Map import java
  • 安卓轮播图

    最近项目中改版 之前的轮播图实现不是很好 这次要改掉 之后就发现了一个完美的轮播图框架 框架地址 框架的使用很简单 步骤 1 依赖Banner dependencies compile com youth banner banner 1 4
  • 最长公共子序列以及最长公共子串

    前言 LCS定义 一个数列S 如果分别是另个或多个已知数列的子序列 且是所有匹配此条件中最长的 则称S是已知数列的最长公共子序列 举个例子 s序列 A B C B D A B t序列 B D C A B A 他们的最长公共子序列为 B C
  • 手机敲代码软件_适合编写C语言代码的编程软件有哪些?大学生赶紧行动起来...

    C语言基本上是大学计算机及其相关专业在大一上学期就会开的一门课程 但是很多学生就是在大一上学期期末的时候很着急 因为自己完全没有学好C语言 感觉一学期白学了 其实究其主要原因 还是因为你在上课认真听了 也做了课堂作业 但是却没有在课后好好的
  • 预见2020关键一年

    12月28日 以 预见2020 区块链关键一年 为主题的2019年第二届中国区块链产业经济年会在北京国际金融博物馆隆重举行 本次大会在中国移动通信联合会区块链专委会 中关村大数据产业联盟 中国电子商会区块链专委会的指导下 由全球领先的区块链
  • sc不为内部或外部命令

    tomcat 注册服务 sc config netman start auto sc 不为内部或外部命令 解决方法 用管理员权限打开cmd C Windows cmd exe
  • iframe设置cookie_惊艳面试官的 Cookie 介绍

    关注在看 以后更多干货分享在头条 Cookie 是什么 Cookie 是用户浏览器保存在本地的一小块数据 它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上 Cookie 主要用于以下三个方面 会话状态管理 如用户登录状态 购物
  • linux系统下“rwx“的概念及用法~

    我们知道 一个文件它的权限情况是怎样的 可以使用用 ls l 查看详细信息这样一条指令 但显示出来的 rwxrwxrwx 究竟是什么意思呢 就让我们来了解一下 r read 读 对文件查看该源文件内容 对目录有查看的权限 w white 写
  • nacos--基础--1.3--理论--架构

    nacos 基础 1 3 理论 架构 1 基本架构及概念 1 1 服务 Service 是指一个或一组软件功能 例如特定信息的检索或一组操作的执行 其目的是不同的客户端可以为不同的目的重用 例如通过跨进程的网络调用 Nacos 支持主流的服
  • easyui 修改window title 正确用法 亲测

    错误用法 mySoftModal panel title 修改title 出现问题 不能拖拽 正确使用方法 mySoftModal window open mySoftModal window draggable true title 添加
  • 学校计算机数量减少说明,一类院校减少但招生量大涨,计算机的同学别慌

    计算机 软件工程 物联网工程 数字媒体技术 网络工程 这5个联考专业是理工类第一大专业 2019年100分以上人数达到3413 相信2020年人数也会平稳增长 同时 一类院校全部停招 充满了竞争的火药味儿 数据解读 2019年 计算机等联考
  • Qt中常见的坐标位置函数的梳理包括x、y、pos()、rect()、size()和geometry()等

    Qt中常见的坐标位置函数的梳理包括x0 y pos rect size 和geometry 等 1 画图梳理 x0 y0和pos 函数的作用都是获得整个窗体左上角的坐标位置 frameGeometr与 函 数与geometry 函数相对应
  • tensorflow学习笔记(三十):tf.gradients 与 tf.stop_gradient() 与 高阶导数

    gradient tensorflow中有一个计算梯度的函数tf gradients ys xs 要注意的是 xs中的x必须要与ys相关 不相关的话 会报错 代码中定义了两个变量w1 w2 但res只与w1相关 wrong import t