【问题标题】:Get gradient with respect to an activation in Keras在 Keras 中获取关于激活的梯度
【发布时间】: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


【解决方案1】:

我有一个类似的错误,你的答案很简单。只需定义一个层并将您的激活用作其激活。这是关于 tf2 的工作示例

t = tf.keras.Input(shape=(1,))
x = keras.layers.Dense(2, input_dim=1, activation=tf.sin, use_bias=True)(t)
y = keras.layers.Dense(1, input_dim=1, activation=tf.cos, use_bias=True)(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([1])
    data_y = tf.random.normal([1])
    tape.watch(data_x)
    y_pred = model(data_x)
    loss = loss_fn(data_y, y_pred)

dL_dt = tape.gradient(loss, [data_x])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 2019-12-18
    • 2019-07-10
    • 2019-06-26
    • 2020-02-13
    • 2019-05-23
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多