使用tf.summary.image显示RNN在python Tensorflow中给出错误

时间:2018-09-05 12:42:20

标签: 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)]
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的功能。

2 个答案:

答案 0 :(得分:1)

您的RNN输出的tf.summary.image形状错误。张量应为四维,其尺寸大小由[batch_size,高度,宽度,通道]给出。

在您的代码中,您要使用tf.summary.image来调用rnn_outputs,其形状为[55413,4,100]。假设您的图像尺寸为55413 x 100像素,并且每个像素包含4个通道(RGBA),我将使用tf.reshapernn_outputs的形状重塑为[1,55413,100,4]。然后,您应该可以正确地致电tf.summary.image

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

答案 1 :(得分: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

在这里,较亮的像素代表更强的激活性,因此,即使很难说出到底是什么原因造成的,也至少可以看到是否出现任何有意义的图案。