【问题标题】:'MultiRNNCell' object is not iterable Python Tensorflow'MultiRNNCell' 对象不可迭代 Python Tensorflow
【发布时间】:2019-02-10 10:18:28
【问题描述】:

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

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

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

【问题讨论】:

  • 有人可以让我知道我可能缺少什么,以便我可以继续前进吗?

标签: python python-3.x tensorflow tensorboard


【解决方案1】:

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)

【讨论】:

  • 如何在 Tensorboard 上显示权重,以及输出是分层的还是有其他的?请先生赐教。
  • @JafferWilson 好吧,那是另一回事,这取决于您想要显示的内容和方式。 tf.summary.histogram 将使用张量中的所有值制作直方图,经过几张图后,您会得到类似于 here 所示的内容。
  • 好的,我明白了。只是多了一个查询。我看到有三种不同的权重,即w_f_diagw_i_diagw_o_diag。可视化应考虑这些权重中的哪一个,以便我可以做出坚定的决策,无论我的模型是否运行良好?
  • 另外,先生,我想知道我是否想看看我的 LSTM 模型在墙内还是墙后发生了什么,有什么可以看的吗?就像实时工作一样,在我的多细胞 RNN 模型中如何建立关联?先生,请赐教。
  • @JafferWilson 好吧,在这种情况下,您实际上每层有 5 个权重,内核、偏差和您提到的三个,它们用于“窥视孔”(如果您没有设置 use_peephole=True它们不会出现)。我想这些的命名遵循Understanding LSTMs 的约定(参见“长期短期记忆的变体”)。 Here 很好地讨论了如何使用直方图来确定您的训练是否有效。
猜你喜欢
  • 2020-02-26
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2018-08-02
  • 1970-01-01
  • 2021-12-13
  • 2013-12-01
相关资源
最近更新 更多