【问题标题】:Tensorflow: List of Tensors for CostTensorflow:成本张量列表
【发布时间】:2016-01-02 20:06:00
【问题描述】:

我正在尝试在 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) 

这样做会导致错误:

TypeError: List of Tensors when single Tensor expected

我应该如何解决这个问题? tf.reduce_mean() 是否接受张量值列表,或者是否有一些特殊的张量对象接受它们?

【问题讨论】:

    标签: python list machine-learning tensorflow


    【解决方案1】:

    在您的代码中,losses 是一个 Python 列表。 TensorFlow 的 reduce_mean() 需要一个张量,而不是 Python 列表。

    losses = tf.reshape(tf.concat(1, losses), [-1, size])
    

    其中 size 是您接受 softmax 的值的数量,应该可以满足您的需求。见concat()

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

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

    请参阅 ptb_word_lm.py 文件中的第 120 行,了解它们在哪里进行连接。

    【讨论】:

    • 知道了,我误会了。我删除了我的答案:) 您可能只想在帖子中显示教程中的代码示例,因为它可能对新手有所帮助(我也想了解)。
    • 我所说的代码位于tensorflow.googlesource.com/tensorflow/+/master/tensorflow/…,而关于输入的部分位于该文件的第 90 行。该文件第 90 行中的 num_steps 与 OP 代码中的 seq_len 相同(大致)。你会建议内联整个 init 方法,还是只提供文件的链接?
    • 啊,我明白了,是的,这是一个非常大的方法。我认为文件的链接,加上一些相关的行和一点点解释,会让它最清楚。您的帖子似乎是一个很好的起点,但我认为看到 OP 没有以正确方式执行的代码部分的“正确示例”将非常有帮助。我有时使用的另一种策略是仅粘贴整个方法/类,但将不相关的行替换为 # ... 以缩短它。
    • 代码示例的链接已失效。例如[tensorflow.googlesource.com/tensorflow/+/master/tensorflow/…
    • github.com/tensorflow/tensorflow/blob/master/tensorflow/models/… 是该代码现在所在的位置,尽管我之前提到的行号不再有意义
    【解决方案2】:

    工作示例,检查notebook

    import tensorflow as tf
    from tensorflow.models.rnn import rnn, rnn_cell
    print(tf.__version__) 
    #> 0.8.0
    
    batch_size  = 2
    output_size = input_size  = 2
    seq_len     = 10
    num_units   = 2
    
    cell = rnn_cell.BasicLSTMCell(num_units)
    inputs = [tf.placeholder(tf.float32, shape=[batch_size,input_size ]) for _ in xrange(seq_len)]
    result = [tf.placeholder(tf.float32, shape=[batch_size,output_size]) for _ in xrange(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(seq_len):
        final_transformed_val = tf.matmul(outputs[i],W_o) + b_o
        losses.append(tf.squared_difference(result[i],final_transformed_val)) 
    
    losses = tf.reshape(tf.concat(1, losses), [-1, seq_len])
    cost = tf.reduce_mean(losses) 
    

    要查看实际情况,您可以以一种 hacky 的方式提供图表:

    import matplotlib.pyplot as plt
    import numpy as np
    
    step = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost)
    sess = tf.InteractiveSession()
    
    sess.run(tf.initialize_all_variables())
    
    costs = []
    
    # EXAMPLE
    #  Learn cumsum over each sequence in x
    # | t        | 0 | 1 | 2 | 3 | 4  | ...|
    # |----------|---|---|---|---|----|----|
    # | x[:,0,0] | 1 | 1 | 1 | 1 | 1  | ...|
    # | x[:,0,1] | 1 | 1 | 1 | 1 | 1  | ...|
    # |          |   |   |   |   |    |    |
    # | y[:,0,0] | 1 | 2 | 3 | 4 | 5  | ...|
    # | y[:,0,1] | 1 | 2 | 3 | 4 | 5  | ...|
    
    n_iterations = 300
    for _ in xrange(n_iterations):
        x  = np.random.uniform(0,1,[seq_len,batch_size,input_size])
        y  = np.cumsum(x,axis=0)
    
        x_list = {key: value for (key, value) in zip(inputs, x)}
        y_list = {key: value for (key, value) in zip(result, y)}
    
        err,_ = sess.run([cost, step], feed_dict=dict(x_list.items()+y_list.items()))
        costs.append(err)
    
    plt.plot(costs)
    plt.show()
    

    作为 tensorflow 初学者,我还没有找到处理 RNN 的统一方式/最佳实践方式,但如上所述,我确信不建议这样做。喜欢你的脚本作为一个非常好的介绍,感谢 sn-ps。另外,implementation of scan and RNN-tuple-friendliness 现在正在发生一些事情,所以要小心

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      相关资源
      最近更新 更多