【问题标题】:Tensorflow - How to get the gradients of the output w.r.t the model parametersTensorflow - 如何获得模型参数的输出梯度
【发布时间】:2017-07-21 23:01:51
【问题描述】:

我想知道是否可以计算模型输出相对于模型参数的梯度。换句话说,我想计算dy / d theta

这是我的意思的一个简短示例:

import keras
import tensorflow as tf

# Dummy input
test = np.random.rand(1, 32, 32, 1)

x = tf.placeholder(tf.float32, shape=(None, 32, 32, 1))

model = keras.layers.Conv2D(16, 5, padding = 'same', activation='elu') (x)
model = keras.layers.Flatten() (model)
model = keras.layers.Dense(128, activation='relu') (model)
predictions = keras.layers.Dense(1) (model)

with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    y = sess.run(predictions, feed_dict={x: test})

    # Get gradients of y w.r.t model parameters.
    gradients = sess.run(tf.gradients(y, model_parameters))

我查看了tf.gradients() 的文档并指出

ysxs 每个都是 Tensor 或张量列表。 grad_ysTensor 的列表,保存ys 接收到的梯度。该列表的长度必须与ys 相同。

所以我明白两个 args 都需要是张量。但是,当我尝试

model_parameters = tf.trainable_variables()

model_parameterstensorflow.python.ops.variables.Variable 类型元素的列表

有没有办法将模型的参数作为张量用于微分?

【问题讨论】:

  • 在这种情况下,“模型的参​​数”是什么意思?
  • 我的意思是模型的权重。在数学上是d y/ d theta
  • 这些变量。或者你认为变量是什么?

标签: python python-2.7 tensorflow keras gradient


【解决方案1】:

这里有两件事。

  1. Theta 对应于层中的权重。
  2. 要在 Keras 中获取权重,请使用 get_weights()。执行以下操作:

    m1 = keras.layers.Conv2D(16, 5, padding = 'same', activation='elu')  
    model = m1 (x)  
    W1 = m1.get_weights()
    

现在您可以看到 W1 包含权重。

【讨论】:

    【解决方案2】:

    好的,所以我想通了。如果我想计算输出相对于网络变量的梯度,就像这样。

    import keras
    import tensorflow as tf
    
    # Dummy input
    test = np.random.rand(1, 32, 32, 1)
    
    x = tf.placeholder(tf.float32, shape=(None, 32, 32, 1))
    
    model = keras.layers.Conv2D(16, 5, padding = 'same', activation='elu') (x)
    model = keras.layers.Flatten() (model)
    model = keras.layers.Dense(128, activation='relu') (model)
    predictions = keras.layers.Dense(1) (model)
    
    # This was the part that I was missing.
    ============================================================
    opt = tf.train.GradientDescentOptimizer(learning_rate=0.01)
    gradient_step = opt.compute_gradients(predictions, tf.trainable_variables())
    ============================================================
    
    with tf.Session() as sess:
        init_op = tf.global_variables_initializer()
        sess.run(init_op)
    
        # This part changed too.
        ==========================================================
        gradients = sess.run(gradient_step, feed_dict={x: test})
        ==========================================================
    

    我必须定义一个优化器tf.train.GradientDescentOptimizer,然后将predictions 提供给gradient_step 操作以找到我的输出的梯度。其实很简单!

    谢谢大家的帮助^.^

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      相关资源
      最近更新 更多