Tensorflow - 如何获得输出的梯度w.r.t模型参数

时间:2017-07-21 23:01:52

标签: python python-2.7 tensorflow keras gradients

我想知道是否可以根据模型参数计算模型输出的梯度。换句话说,我想计算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

类型的元素列表

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

2 个答案:

答案 0 :(得分:0)

这里有两件事。

  1. Theta对应于图层中的权重。
  2. 要在Keras中获得权重,请使用get_weights()。做类似下面的事情:

    m1 = keras.layers.Conv2D(16, 5, padding = 'same', activation='elu')  
    model = m1 (x)  
    W1 = m1.get_weights()
    
  3. 现在你可以看到W1保持了权重。

答案 1 :(得分:0)

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

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操作以查找输出的渐变。实际上非常简单!

谢谢大家的帮助^。^