- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 TensorFlow 中的自动微分计算梯度时遇到问题。基本上我想创建一个神经网络,它只有一个输出值 f 并获得两个值(x,t)的输入。网络应该像一个数学函数,所以在这种情况下 f(x,t) 其中 x 和 t 是输入变量,我想计算偏导数,例如 df_dx, d2f/dx2
或 df_dt
.稍后我需要这些偏导数用于特定的损失函数。
这是我的简化代码:
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Model
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
self.flatten = Flatten(input_shape=(2, 1))
self.d1 = Dense(28)
self.f = Dense(1)
def call(self, y):
y = self.flatten(y)
y = self.d1(y)
y = self.f(y)
return y
if __name__ == "__main__":
#inp contains the input-variables (x,t)
inp = np.random.rand(1,2,1)
inp_tf = tf.convert_to_tensor(inp, np.float32)
#Create a Model
model = MyModel()
#Here comes the important part:
x = inp_tf[0][0]
t = inp_tf[0][1]
with tf.GradientTape(persistent=True) as tape:
tape.watch(inp_tf[0][0])
tape.watch(inp_tf)
f = model(inp_tf)
df_dx = tape.gradient(f, inp_tf[0][0]) #Derivative df_dx
grad_f = tape.gradient(f, inp_tf)
tf.print(f) #--> [[-0.0968768075]]
tf.print(df_dx) #--> None
tf.print(grad_f) #--> [[[0.284864038]
# [-0.243642956]]]
df_dx = [0.284864038]
(grad_f 的第一个组件),但结果是
None
.我的问题是:
None
? class MyModel
的架构我使用两个不同的 Inputlayer(一个用于 x,一个用于 t),这样我就可以像
f = model(x,t)
这样的模型调用但这对我来说似乎不自然,我认为应该有一种更简单的方法。
self.flatten = Flatten(input_shape=(5,1)
时,我没有收到错误消息。但是我的输入向量具有形状(1,2,1),所以我希望得到一个错误,但事实并非如此,为什么?我很感激你的帮助:)
最佳答案
每次做 inp_tf[0][0]
或 inp_tf[0][1]
您正在创建一个新张量,但该新张量未用作模型的输入,inp_tf
是。即使 inp_tf[0][0]
如果 inp_tf
的一部分,从TensorFlow的角度来看,你新创建的inp_tf[0][0]
之间没有计算图。和 f
,因此没有梯度。您必须计算关于 inp_tf
的梯度然后从那里获取您想要的渐变部分。
除此之外,如 tf.GradientTape
的文档中所示,您可以使用嵌套磁带来计算二阶导数。而且,如果您使用 jacobian
,您可以避免使用 persistent=True
,这对性能更好。这是它在您的示例中的工作方式(我将层激活函数更改为 sigmoid
,因为默认的线性激活没有二阶导数)。
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Model
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
self.flatten = Flatten(input_shape=(2, 1))
self.d1 = Dense(28, activation='sigmoid')
self.f = Dense(1, activation='sigmoid')
def call(self, y):
y = self.flatten(y)
y = self.d1(y)
y = self.f(y)
return y
np.random.seed(0)
inp = np.random.rand(1, 2, 1)
inp_tf = tf.convert_to_tensor(inp, np.float32)
model = MyModel()
with tf.GradientTape() as tape:
tape.watch(inp_tf)
with tf.GradientTape() as tape2:
tape2.watch(inp_tf)
f = model(inp_tf)
grad_f = tape2.gradient(f, inp_tf)
df_dx = grad_f[0, 0]
df_dt = grad_f[0, 1]
j = tape.jacobian(grad_f, inp_tf)
d2f_dx2 = j[0, 0, :, 0, 0]
d2f_dyx = j[0, 0, :, 0, 1]
d2f_dy2 = j[0, 1, :, 0, 1]
d2f_dxy = j[0, 1, :, 0, 0]
tf.print(df_dx)
# [0.0104712956]
tf.print(df_dt)
# [-0.00301733566]
tf.print(d2f_dx2)
# [[-0.000243180315]]
tf.print(d2f_dyx)
# [[-0.000740956515]]
tf.print(d2f_dy2)
# [[1.49392872e-05]]
tf.print(d2f_dxy)
# [[-0.000740956573]]
关于python - 在 TensorFlow2 中使用 GradientTape() 计算偏导数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61410282/
在查看 Tensorflow 1.15 中的 OptimizerV2 代码时,我注意到他们使用 backprop.GradientTape 来计算梯度。 我找不到任何关于此类的在线引用,只能找到 tf
晚上好 我想使用 tf2 和 Gradient Tape 函数为一个简单的回归问题实现一个玩具示例。使用 Model.fit 它可以正确学习,但与 GradientTape 一样可以做一些事情,但与
晚上好 我想使用 tf2 和 Gradient Tape 函数为一个简单的回归问题实现一个玩具示例。使用 Model.fit 它可以正确学习,但与 GradientTape 一样可以做一些事情,但与
背景 在 Tensorflow 2 中,存在一个名为 GradientTape 的类。它用于记录对张量的操作,然后可以将其结果微分并馈送到一些最小化算法。例如,from the documentati
我想使用GradientTape在急切执行模式下观察梯度。是否可以创建一个 GradientTape 一次,然后记录所有内容,就好像它具有全局上下文一样? 这是我想做的一个例子: import num
我正在尝试计算 TensorFlow 神经网络输出相对于其输入的雅可比行列式。使用 tf.GradientTape.jacobian 方法可以轻松实现这一点。 TensorFlow 文档中提供的简单示
我试图在每个时期更新权重,但我正在分批处理数据。问题是,为了规范化损失,我需要在训练循环之外记录 TensorFlow 变量(以进行跟踪和规范化)。但是当我这样做时,训练时间很长。 我认为,它将所有批
按照以下代码连接了 3 个神经网络,我们如何从初始网络中获取两个梯度?第一个梯度有效,但第二个梯度返回 None 张量。似乎它们彼此无关以获得梯度。我该如何解决这个问题? with tf.Gradie
我尝试在 Eager 模式下使用 Tensorflow 计算梯度,但是tf.GradientTape () 仅返回 None 值。我不明白为什么。梯度在 update_policy() 函数中计算。
我正在尝试使用 tf.GradientTape 计算梯度。当我尝试使用损失和 Model.variables (tf.keras.Model) 作为输入时,结果以 None 数组的形式返回给我。我究竟
我使用 tf.GradientTape 训练逻辑回归,但它无法收敛 import numpy as np import tensorflow as tf from tensorflow import
我想使用 keras 的预训练模型进行迁移学习 import tensorflow as tf from tensorflow import keras base_model = keras.appl
你好, 我目前正尝试在 Tensorflow 1.13.1 中计算梯度并使用 GradientTape official documentation 中解释的类, 但我得到一个 TypeError:
我正在尝试对使用 SavedModel 加载的模型进行对抗性攻击API。我想针对给定目标的模型损失对输入进行梯度下降。代码有点长,但它是说明问题的最低限度。 from __future__ impor
我在使用 TensorFlow 中的自动微分计算梯度时遇到问题。基本上我想创建一个神经网络,它只有一个输出值 f 并获得两个值(x,t)的输入。网络应该像一个数学函数,所以在这种情况下 f(x,t)
我发现计算的梯度取决于 tf.function 装饰器的相互作用,如下所示。 首先,我为二元分类创建了一些合成数据 tf.random.set_seed(42) np.random.seed(42)
我正在尝试切换到 TensorFlow 热切模式,我找到了 GradientTape 的文档, implicit_gradients , gradients_function和 implicit_va
我开始学习 Tensorflow2.0,我困惑的一个主要来源是什么时候使用 keras-like model.compile vs tf.GradientTape 训练模型。 在用于 MNIST 分类
在 tensorflow 版本 2.0.0-beta1 中,我正在尝试实现一个 keras 层,它具有从正态随机分布中采样的权重.我想将分布的均值作为可训练参数。 感谢 tensorflow-prob
当我使用 tf.Variable 的分配方法来更改变量的值时,它会阻止 tf.Gradient,例如。例如,请参阅下面的玩具示例代码: (注意:我只对 TensorFlow 2 感兴趣。) x = t
我是一名优秀的程序员,十分优秀!