我使用tensorflow实现了一个简单的RNN,如下所示:
cell = tf.contrib.rnn.BasicRNNCell(state_size)
cell = tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob=keep_prob)
rnn_outputs, final_state = tf.nn.dynamic_rnn(cell, batch_size, dypte=tf.float32)
这很好用。但是我想将权重变量记录到摘要编写器中。有没有办法做到这一点?
顺便问一下,我们使用tf.nn.rnn_cell.BasicRNNCell
还是tf.contrib.rnn.BasicRNNCell
?或者它们是否相同?
答案 0 :(得分:4)
但是我想将权重变量记录到摘要编写器中。有没有办法做到这一点?
您可以通过tf.get_variable()
功能获取变量。 tf.summary.histogram
接受张量实例,因此使用Graph.get_tensor_by_name()
:
n_steps = 2
n_inputs = 3
n_neurons = 5
X = tf.placeholder(dtype=tf.float32, shape=[None, n_steps, n_inputs])
basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
with tf.variable_scope('rnn', reuse=True):
print(tf.get_variable('basic_rnn_cell/kernel'))
kernel = tf.get_default_graph().get_tensor_by_name('rnn/basic_rnn_cell/kernel:0')
tf.summary.histogram('kernel', kernel)
顺便问一下,我们使用tf.nn.rnn_cell.BasicRNNCell或tf.contrib.rnn.BasicRNNCell吗?或者它们是否相同?
是的,它们是同义词,但我更喜欢使用tf.nn.rnn_cell
包,因为tf.contrib
中的所有内容都是实验性的,可以在1.x版本中进行更改。
答案 1 :(得分:2)
Maxim的答案很棒。 我发现另一种方法对我有用,你不必提供重量变量的名称。此方法使用优化器对象和compute_gradients方法。
说,你从dynamic_rnn调用中获得(输出,状态)后计算“损失”。现在获得您选择的优化器。说亚当,
optzr = tf.train.AdamOptimizer(learning_rate)
grads_and_vars = optzr.compute_gradients(loss)
“grads_and_vars”是(渐变,变量)对的列表。现在通过迭代“grads_and_vars”,您可以获得所有权重/偏差和相应的渐变(如果有的话)。像,
for grad, vars in grads_and_vars:
print (vars, vars.name)
tf.summary.histogram(vars.name, vars)
价: https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer#compute_gradients