如何获取tensorflow RNN的摘要信息

时间:2018-02-22 13:55:50

标签: tensorflow machine-learning neural-network recurrent-neural-network tensorboard

我使用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?或者它们是否相同?

2 个答案:

答案 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