我想知道是否可以根据模型参数计算模型输出的梯度。换句话说,我想计算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()
的文档,并说明了
ys
和xs
均为Tensor
或张量列表。grad_ys
是Tensor
的列表,其中包含ys
收到的渐变。该列表的长度必须与ys
相同。
所以我明白两个args都需要一个张量。但是,当我尝试
时 model_parameters = tf.trainable_variables()
model_parameters
是tensorflow.python.ops.variables.Variable
有没有办法将模型的参数作为张量用于区分?
答案 0 :(得分:0)
这里有两件事。
要在Keras中获得权重,请使用get_weights()
。做类似下面的事情:
m1 = keras.layers.Conv2D(16, 5, padding = 'same', activation='elu')
model = m1 (x)
W1 = m1.get_weights()
现在你可以看到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
操作以查找输出的渐变。实际上非常简单!
谢谢大家的帮助^。^