Tensorflow:成本的张量列表

ari*_*izz 5 python list machine-learning tensorflow

我正在尝试使用Tensor Flow中的LSTM.我在网上找到了一个教程,其中包含一组序列,目标函数由LSTM的最后一个输出和已知值组成.但是,我希望我的目标函数使用每个输出的信息.具体来说,我试图让LSTM学习一系列序列(即在一个句子中学习单词中的所有字母):

cell = rnn_cell.BasicLSTMCell(num_units)
inputs = [tf.placeholder(tf.float32,shape=[batch_size,input_size]) for _ in range(seq_len)]
result = [tf.placeholder(tf.float32, shape=[batch_size,input_size]) for _ in range(seq_len)]

W_o = tf.Variable(tf.random_normal([num_units,input_size], stddev=0.01))     
b_o = tf.Variable(tf.random_normal([input_size], stddev=0.01))

outputs, states = rnn.rnn(cell, inputs, dtype=tf.float32)   

losses = []

for i in xrange(len(outputs)):
    final_transformed_val = tf.matmul(outputs[i],W_o) + b_o
    losses.append(tf.nn.softmax(final_transformed_val))

cost = tf.reduce_mean(losses) 
Run Code Online (Sandbox Code Playgroud)

这样做会导致错误:

TypeError: List of Tensors when single Tensor expected
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?是否tf.reduce_mean()采用张量值列表,还是有一些特殊的张量对象需要它们?

Rya*_*out 3

在你的代码中,losses有一个Python列表。TensorFlowreduce_mean()需要单个张量,而不是 Python 列表。

losses = tf.reshape(tf.concat(1, losses), [-1, size])
Run Code Online (Sandbox Code Playgroud)

其中 size 是您要采用 softmax 的值的数量,应该可以满足您的要求。请参阅concat()

但是,我在您的代码中注意到的一件事似乎有点奇怪,那就是您的输入有一个占位符列表,而TensorFlow 教程中的代码使用 3 阶张量作为输入。您的输入是 2 阶张量的列表。我建议查看教程中的代码,因为它几乎完全符合您的要求。

该教程的主要文件之一位于此处。特别是,第 139 行是他们创建成本的地方。关于您的输入,第 90 行和第 91 行是设置输入和目标占位符的位置。这两行的主要要点是整个序列是在单个占位符中传递的,而不是使用占位符列表传递的。

请参阅 ptb_word_lm.py 文件中的第 120 行以了解它们在何处进行串联。