使用tf.summary.image显示RNN会在python tensorflow中出错

问题描述 投票:0回答:2

这是我尝试过的:

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)]
multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)
rnn_outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
tf.summary.histogram("outputs", rnn_outputs)
tf.summary.image("RNN",rnn_outputs)

我收到以下错误:

InvalidArgumentError: Tensor must be 4-D with last dim 1, 3, or 4, not [55413,4,100]
     [[Node: RNN_1 = ImageSummary[T=DT_FLOAT, bad_color=Tensor<type: uint8 shape: [4] values: 255 0 0...>, max_images=3, _device="/job:localhost/replica:0/task:0/device:CPU:0"](RNN_1/tag, rnn/transpose_1)]]

请帮助我获取我正在尝试运行的LSTM模型中的rnn的可视化。这将有助于更准确地了解LSTM正在做什么。

python python-3.x tensorflow tensorboard
2个回答
1
投票

您可以将每个RNN输出绘制为一个图像,其中一个轴是时间,另一个轴是输出。这是一个小例子:

import tensorflow as tf
import numpy as np

n_steps = 100
n_inputs = 10
n_neurons = 10
n_layers = 3

x = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
layers = [tf.contrib.rnn.LSTMCell(num_units=n_neurons,
                                  activation=tf.nn.leaky_relu, use_peepholes=True)
         for layer in range(n_layers)]
multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)
rnn_outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, x, dtype=tf.float32)
# Time steps in horizontal axis, outputs in vertical axis, add last dimension for channel
rnn_out_imgs = tf.transpose(rnn_outputs, (0, 2, 1))[..., tf.newaxis]
out_img_sum = tf.summary.image("RNN", rnn_out_imgs, max_outputs=10)
init_op = tf.global_variables_initializer()
with tf.Session() as sess, tf.summary.FileWriter('log') as fw:
    sess.run(init_op)
    fw.add_summary(sess.run(out_img_sum, feed_dict={x: np.random.rand(10, n_steps, n_inputs)}))

你会得到一个看起来像这样的可视化:

RNN visualization

在这里,更亮的像素将代表更强的激活,因此即使很难分辨究竟是什么造成了什么,至少可以看出是否出现了任何有意义的模式。


1
投票

您的RNN输出的tf.summary.image形状错误。张量应该是四维的,尺寸的大小由[batch_size,height,width,channels]给出。

在你的代码中,你用tf.summary.image调用rnn_outputs,它具有形状[55413,4,100]。假设您的图像大小为55413×100像素,并且每个像素包含4个通道(RGBA),我将使用tf.reshapernn_outputs重塑为[1,55413,100,4]。然后你应该能够毫无错误地调用tf.summary.image

我认为我无法帮助您想象RNN的操作,但当我了解RNN和LSTM时,我发现this article非常有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.