- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好,
我目前正尝试在 Tensorflow 1.13.1 中计算梯度并使用 GradientTape
official documentation 中解释的类, 但我得到一个 TypeError: Fetch argument None has invalid type <class 'NoneType'>
.
下面,我将包括两个我得到这个错误的简单案例,只使用开箱即用的 Tensorflow 函数,第一个是更简单的最小工作示例,第二个是我实际需要解决/得到一个工作-大约。为了完整起见,我使用的是 Python 3.6.8。
import tensorflow as tf
tf.reset_default_graph()
x = tf.constant([1., 2., 3.])
with tf.GradientTape(persistent=True) as gg:
gg.watch(x)
f1 = tf.map_fn(lambda a: a**2, x)
f2 = x*x
# Computes gradients
d_fx1 = gg.gradient(f1, x) #Line that causes the error
d_fx2 = gg.gradient(f2, x) #No error
del gg #delete persistent GradientTape
with tf.Session() as sess:
d1, d2 = sess.run((d_fx1, d_fx2))
print(d1, d2)
在此代码中,f1
和 f2
以不同的方式计算,但给出相同的数组。但是,当尝试计算与它们相关的梯度时,第一行给出以下错误,而第二行完美无缺。我在错误的堆栈跟踪下方报告
TypeError Traceback (most recent call last)
<ipython-input-1-9c59a2cf2d9b> in <module>()
15
16 with tf.Session() as sess:
---> 17 d1, d2 = sess.run((d_fx1, d_fx2))
18 print(d1, d2)
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in run(self, fetches, feed_dict, options, run_metadata)
927 try:
928 result = self._run(None, fetches, feed_dict, options_ptr,
--> 929 run_metadata_ptr)
930 if run_metadata:
931 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
1135 # Create a fetch handler to take care of the structure of fetches.
1136 fetch_handler = _FetchHandler(
-> 1137 self._graph, fetches, feed_dict_tensor, feed_handles=feed_handles)
1138
1139 # Run request and get response.
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in __init__(self, graph, fetches, feeds, feed_handles)
469 """
470 with graph.as_default():
--> 471 self._fetch_mapper = _FetchMapper.for_fetch(fetches)
472 self._fetches = []
473 self._targets = []
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in for_fetch(fetch)
259 elif isinstance(fetch, (list, tuple)):
260 # NOTE(touts): This is also the code path for namedtuples.
--> 261 return _ListFetchMapper(fetch)
262 elif isinstance(fetch, collections.Mapping):
263 return _DictFetchMapper(fetch)
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in __init__(self, fetches)
368 """
369 self._fetch_type = type(fetches)
--> 370 self._mappers = [_FetchMapper.for_fetch(fetch) for fetch in fetches]
371 self._unique_fetches, self._value_indices = _uniquify_fetches(self._mappers)
372
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in <listcomp>(.0)
368 """
369 self._fetch_type = type(fetches)
--> 370 self._mappers = [_FetchMapper.for_fetch(fetch) for fetch in fetches]
371 self._unique_fetches, self._value_indices = _uniquify_fetches(self._mappers)
372
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in for_fetch(fetch)
256 if fetch is None:
257 raise TypeError('Fetch argument %r has invalid type %r' % (fetch,
--> 258 type(fetch)))
259 elif isinstance(fetch, (list, tuple)):
260 # NOTE(touts): This is also the code path for namedtuples.
TypeError: Fetch argument None has invalid type <class 'NoneType'>
请注意,我也尝试过一次只计算一个梯度,即 persistent=False
, 得到相同的结果。
下面,我还将包括最小的工作示例,以重现我遇到的相同错误,但试图解决我实际正在处理的问题。
在此代码中,我使用了 RNN
计算输出 w.r.t 一些输入,我需要计算 jacobian
这个输出 w.r.t 输入。
import tensorflow as tf
from tensorflow.keras.layers import RNN, GRUCell
# Define size of variable. TODO: adapt to data
inp_dim = 2
num_units = 50
batch_size = 100
timesteps = 10
# Reset the graph, so as to avoid errors
tf.reset_default_graph()
# Building the model
inputs = tf.ones(shape=(timesteps, batch_size, inp_dim))
# Follow gradient computations
with tf.GradientTape() as g:
g.watch(inputs)
cells = [GRUCell(num_units), GRUCell(num_units)]
rnn = RNN(cells, time_major=True, return_sequences=True)
f = rnn(inputs)
d_fx = g.batch_jacobian(f, inputs)
# Run graph
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
grads = sess.run(d_fx)
grads.shape
关于堆栈跟踪,我得到了相同的错误,但行数较少(此堆栈跟踪中有一个 for_fetch
、 <listcomp>
和 __init
较少)。为了完整起见,我仍然在下面包含它
TypeError Traceback (most recent call last)
<ipython-input-5-bb2ce4eebe87> in <module>()
25 with tf.Session() as sess:
26 sess.run(tf.global_variables_initializer())
---> 27 grads = sess.run(d_fx)
28 grads.shape
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in run(self, fetches, feed_dict, options, run_metadata)
927 try:
928 result = self._run(None, fetches, feed_dict, options_ptr,
--> 929 run_metadata_ptr)
930 if run_metadata:
931 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
1135 # Create a fetch handler to take care of the structure of fetches.
1136 fetch_handler = _FetchHandler(
-> 1137 self._graph, fetches, feed_dict_tensor, feed_handles=feed_handles)
1138
1139 # Run request and get response.
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in __init__(self, graph, fetches, feeds, feed_handles)
469 """
470 with graph.as_default():
--> 471 self._fetch_mapper = _FetchMapper.for_fetch(fetches)
472 self._fetches = []
473 self._targets = []
C:\HOMEWARE\Miniconda3-Windows-x86_64\envs\rdwsenv\lib\site-packages\tensorflow\python\client\session.py in for_fetch(fetch)
256 if fetch is None:
257 raise TypeError('Fetch argument %r has invalid type %r' % (fetch,
--> 258 type(fetch)))
259 elif isinstance(fetch, (list, tuple)):
260 # NOTE(touts): This is also the code path for namedtuples.
TypeError: Fetch argument None has invalid type <class 'NoneType'>
我觉得某些 Tensorflow 函数存在错误导致我出错,但我不确定。最后,我感兴趣的是得到 tensor
包含我的网络 w.r.t 到输入的输出的 jacobian。我如何使用其他工具或更正我的代码来实现这一点?
编辑:好的,所以我考虑了 danyfang 的评论,并试图调查他在 Github 上提出的关于 tf.gradients
的问题。返回 None
而不是 0
由于低级 Tensorflow 中的一些实现设计。
因此,我尝试创建一个简单的案例,我确信梯度不同于 0
, 通过计算 tf.matmul(tf.transpose(x), x)
.我在 MWE 下方发布。
import tensorflow as tf
tf.reset_default_graph()
x = tf.constant([[1., 2., 3.]])
with tf.GradientTape(persistent=True) as gg:
gg.watch(x)
y = tf.matmul(x, tf.transpose(x))
f1 = tf.map_fn(lambda a: a, y)
# Computes gradients
d_fx1 = gg.gradient(f1, x)
d_yx = gg.gradient(y, x)
del gg #delete persistent GradientTape
with tf.Session() as sess:
#d1 = sess.run(d_fx1) # Same error None type
d2 = sess.run(d_yx) #Works flawlessly. returns array([[2., 4., 6.]], dtype=float32)
d2
这表明(至少在我看来)错误的出现不是因为此 issue 报告的行为,但另一件事是由于较低级别的实现。
最佳答案
编辑:下面,我报告了我如何计算输出的 tf.hessians
w.r.t 输入。
我使用函数 tf.gradients
成功计算了梯度。但是,根据文档,此函数使用符号推导,而 GradientTape.gradient
使用自动微分。我正在阅读的论文中,他们谈论自动微分,所以我不知道以后是否会遇到一些问题,但至少我的代码可以运行。
下面,我发布了一个 MWE,其中包含我已经使用过的 RNN 代码。
import tensorflow as tf
from tensorflow.keras.layers import RNN, GRUCell, Dense
# Define size of variable. TODO: adapt to data
inp_dim = 2
num_units = 50
batch_size = 100
timesteps = 10
# Reset the graph, so as to avoid errors
tf.reset_default_graph()
inputs = tf.ones(shape=(timesteps, batch_size, inp_dim))
### Building the model
cells = [GRUCell(num_units), GRUCell(num_units)]
rnn = RNN(cells, time_major=True, return_sequences=True)
final_layer = Dense(1, input_shape=(num_units,))
# Apply to inputs
last_state = rnn(inputs)
f = final_layer(last_state)
[derivs] = tf.gradients(f, inputs)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
grads = sess.run(derivs)
只是警告任何想要计算二阶导数的感兴趣的旁观者,不支持使用tf.gradients(tf.gradients(func, vars))
。还有一个叫做tf.hessian
的函数,但是在上面的代码中用tf.hessian
替换tf.gradients
没有起作用,导致错误太长了,我不会在这里包括它。我很可能会在 Github 上做一个问题,我会在此处为任何感兴趣的人提供链接。目前,当我遇到一个不令人满意的解决方法时,我会将我自己的响应标记为解决我的问题。
查看此 issue在 Github 上。
关于python - TypeError 使用 GradientTape.gradient 计算梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55904359/
在查看 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
我是一名优秀的程序员,十分优秀!