我所追求的功能是能够在给定一些数据的情况下告诉给定变量的梯度与我的误差函数有关.
实现这一目标的一种方法是查看变量在调用训练后变化了多少,但显然可以根据学习算法大量变化(例如,几乎不可能用RProp这样的东西来判断)并且只是不是很干净.
提前致谢.
我有一个用 InceptionNet 制作的网络,对于输入样本bx,我想计算隐藏层的模型输出的梯度。我有以下代码:
bx = tf.reshape(x_batch[0, :, :, :], (1, 299, 299, 3))
with tf.GradientTape() as gtape:
#gtape.watch(x)
preds = model(bx)
print(preds.shape, end=' ')
class_idx = np.argmax(preds[0])
print(class_idx, end=' ')
class_output = model.output[:, class_idx]
print(class_output, end=' ')
last_conv_layer = model.get_layer('inception_v3').get_layer('mixed10')
#gtape.watch(last_conv_layer)
print(last_conv_layer)
grads = gtape.gradient(class_output, last_conv_layer.output)#[0]
print(grads)
Run Code Online (Sandbox Code Playgroud)
但是,这会给None. 我也试过gtape.watch(bx)了,但它仍然给出None.
在尝试 GradientTape 之前,我尝试使用tf.keras.backend.gradient但出现如下错误:
RuntimeError: tf.gradients is not supported when eager execution is enabled. Use tf.GradientTape instead.
Run Code Online (Sandbox Code Playgroud)
我的模型如下:
model.summary()
Model: "sequential_4"
_________________________________________________________________ …Run Code Online (Sandbox Code Playgroud)