0

我想计算 Tensorflow 中神经网络的损失函数相对于所有参数(或可训练变量)的粗麻布。通过修改 Tensorflow 文档(https://www.tensorflow.org/api_docs/python/tf/GradientTape)中的示例代码,我设法计算了第一层的权重矩阵的粗麻布(如果我没记错的话) :

with tf.GradientTape(persistent=True) as tape:
    loss = tf.reduce_mean(model(x,training=True)**2)
    g = tape.gradient(loss,model.trainable_variables[0]) 
    h=tape.jacobian(g,model.trainable_variables[0])

如果我尝试用 model.trainable_variables 来计算它,tape.jacobian 会抱怨“列表对象没有属性形状”。相反,我尝试将 model.trainable_variables 展平并用展平的向量计算它:

with tf.GradientTape(persistent=True) as tape:
    loss = tf.reduce_mean(model(x,training=True)**2)
    source = tf.concat([tf.reshape(x,[-1]) for x in model.trainable_variables],axis=0)
    g = tape.gradient(loss,source) 
    h=tape.jacobian(g,source)
   

现在的问题是 g 出于某种原因是空的(NoneType)。我注意到 source 是 tf.Tensor-type 但 model.trainable_variables[0] 是 tf.ResourceVariable 类型,所以我尝试通过将 source 声明为

source = resource_variable_ops.ResourceVariable(tf.concat([tf.reshape(x,[-1]) for x in model.trainable_variables],axis=0))

但这并没有改变任何东西,所以我猜这不是问题。我还认为问题可能是源变量没有被观看,但似乎它被设置为可训练,即使我执行tape.watch(source),g 仍然是空的。

有谁知道我该如何解决这个问题?

4

1 回答 1

0

也许您可以在可训练变量上使用循环?我知道这是一个基本的想法。

with tf.GradientTape(persistent=True) as tape:
    loss = tf.reduce_mean(model(x,training=True)**2)
    g_list, h_list = [], []
    for train_var in model.trainable_variables:
      g = tape.gradient(loss, train_var)
      g_list.append(g)
      h_list.append(tape.jacobian(g, train_var))

您还可以在计算雅可比行列之前使用第二个循环并尝试连接输出列表。

于 2021-11-04T15:35:12.557 回答