'MultiRNNCell'对象不可迭代Python Tensorflow

时间:2018-09-05 09:55:43

标签: python python-3.x tensorflow tensorboard

我正在尝试根据层将权重和偏差添加到张量板。我尝试了以下方法:

tf.reset_default_graph()

X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
y = tf.placeholder(tf.float32, [None,n_outputs])


layers = [tf.contrib.rnn.LSTMCell(num_units=n_neurons, 
                                 activation=tf.nn.leaky_relu, use_peepholes = True)
         for layer in range(n_layers)]
# for i, layer in enumerate(layers):
#     tf.summary.histogram('layer{0}'.format(i), tf.convert_to_tensor(layer))


multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)
for index,one_lstm_cell in enumerate(multi_layer_cell):
    one_kernel, one_bias = one_lstm_cell.variables
    # I think TensorBoard handles summaries with the same name fine.
    tf.summary.histogram("Kernel", one_kernel)
    tf.summary.histogram("Bias", one_bias)
rnn_outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)

stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, n_neurons]) 
stacked_outputs = tf.layers.dense(stacked_rnn_outputs, n_outputs)
outputs = tf.reshape(stacked_outputs, [-1, n_steps, n_outputs])
outputs = outputs[:,n_steps-1,:] # keep only last output of sequence

但是我遇到了以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-43-761df6e116a7> in <module>()
     44 
     45 multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)
---> 46 for index,one_lstm_cell in enumerate(multi_layer_cell):
     47     one_kernel, one_bias = one_lstm_cell.variables
     48     # I think TensorBoard handles summaries with the same name fine.

TypeError: 'MultiRNNCell' object is not iterable

我想知道我错过了什么,以便可以在张量板上添加用于可视化的变量。请帮助我。

1 个答案:

答案 0 :(得分:2)

MultiRNNCell确实不是可迭代的。对于您的情况,首先,在调用tf.nn.dynamic_rnn之前不会创建RNN变量,因此您应该尝试在之后检索它们。其次,使用use_peephole,您将拥有更多的内核变量和偏差变量。要检索它们,您可以从multi_layer_cell.variables或通过存储在layers中的单元对象访问每一层自己的集合中的所有RNN变量:

multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)
rnn_outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
for index, one_lstm_cell in enumerate(layers):
    one_kernel, one_bias, *one_peepholes = one_lstm_cell.variables
    tf.summary.histogram("Kernel", one_kernel)
    tf.summary.histogram("Bias", one_bias)