【发布时间】:2021-04-06 20:28:05
【问题描述】:
我可以通过在我的输入中显式添加手表来获得损失 w.r.t 输入张量的梯度,如下所示:
t = tf.keras.Input(shape=(5))
x = tf.sin(t)
y = tf.cos(t)
z = x + y
model = tf.keras.Model(inputs=t, outputs=z)
loss_fn = tf.keras.losses.MeanSquaredError()
with tf.GradientTape(persistent=True) as tape:
data_x = tf.random.normal([5])
data_y = tf.random.normal([5])
tape.watch(data_x)
y_pred = model(data_x)
loss = loss_fn(data_y, y_pred)
dL_dt = tape.gradient(loss, [data_x])
我怎样才能对特定层的输出做同样的事情?通过tape.watch(model.layers[1].output) 之类的操作添加手表不起作用:
~/miniconda3/envs/my_env/lib/python3.8/site-packages/tensorflow/python/eager/backprop.py in watch(self, tensor)
903 for t in nest.flatten(tensor, expand_composites=True):
904 if not (_pywrap_utils.IsTensor(t) or _pywrap_utils.IsVariable(t)):
--> 905 raise ValueError("Passed in object of type {}, not tf.Tensor".format(
906 type(t)))
907 if not backprop_util.IsTrainable(t):
ValueError: Passed in object of type <class 'tensorflow.python.keras.engine.keras_tensor.KerasTensor'>, not tf.Tensor
更新:如果我定义我的模型,使其始终返回我感兴趣的激活作为输出 (model = tf.keras.Model(inputs=t, outputs=[z, x])),那么我以后可以使用该输出来计算梯度,但 Keras 不能这不好。一定有更简单的方法。
【问题讨论】:
-
最简单的方法是定义 sub_model = Model(inputs=model.input, outputs=model.layers[1].output) 并在 GradientTape 内部调用
标签: keras tensorflow2.0 tf.keras