【问题标题】:Issue feeding a list into feed_dict in TensorFlow将列表输入到 TensorFlow 中的 feed_dict 的问题
【发布时间】:2016-02-14 13:22:39
【问题描述】:

我正在尝试将一个列表传递给feed_dict,但是我在这样做时遇到了麻烦。说我有:

inputs = 10 * [tf.placeholder(tf.float32, shape=(batch_size, input_size))]

输入被输入到我想要计算的某个函数outputs。因此,为了在 tensorflow 中运行它,我创建了一个会话并运行以下命令:

sess.run(outputs, feed_dict = {inputs: data}) 
#data is my list of inputs, which is also of length 10

但我得到一个错误,TypeError: unhashable type: 'list'. 但是,我可以像这样按元素传递数据:

sess.run(outputs, feed_dict = {inputs[0]: data[0], ..., inputs[9]: data[9]}) 

所以我想知道是否有办法解决这个问题。我还尝试构建一个字典(使用for 循环),但是这会导致字典只有一个元素,它们的关键是: tensorflow.python.framework.ops.Tensor at 0x107594a10

【问题讨论】:

  • 你试过 sess.run(outputs, feed_dict=dict(zip(inputs, data))) 吗?
  • 是的,我遇到了与 for 循环方法相同的问题。

标签: python tensorflow


【解决方案1】:

这是一个正确的例子:

batch_size, input_size, n = 2, 3, 2
# in your case n = 10
x = tf.placeholder(tf.types.float32, shape=(n, batch_size, input_size))
y = tf.add(x, x)

data = np.random.rand(n, batch_size, input_size)

sess = tf.Session()
print sess.run(y, feed_dict={x: data})

我在你的方法中看到了一件奇怪的事情。出于某种原因,您使用 10 * [tf.placeholder(...)],它创建了 10 个大小为 (batch_size, input_size) 的张量。不知道你为什么要这样做,如果你可以在等级 3 的张量上创建(第一个维度是 10)。

因为您有张量列表(而不是张量),所以您无法将数据输入到此列表中(但在我的情况下,我可以输入张量)。

【讨论】:

  • 所以我这样做的原因是因为我正在尝试使用 tensorflow 中提供的 rnn 方法,当我传递一个 3 维张量时出现错误:“TypeError: inputs must be a list "。
  • 所以我还能够通过传递一个 3-d 张量然后拆分和挤压它,然后以这种方式将输入传递给我的操作/函数来解决这个问题。谢谢。
【解决方案2】:

这里有两个问题导致问题:

第一个问题是Session.run()调用只接受少数类型作为feed_dict的键。特别是,张量列表支持作为键,因此您必须将每个张量作为单独的键。*一种方便的方法这样做是使用字典理解:

inputs = [tf.placeholder(...), ...]
data = [np.array(...), ...]
sess.run(y, feed_dict={i: d for i, d in zip(inputs, data)})

第二个问题是 Python 中的10 * [tf.placeholder(...)] 语法创建了一个包含十个元素的列表,其中每个元素是相同的张量对象(即具有相同的@ 987654326@ 属性,相同的id 属性,如果您使用inputs[i] is inputs[j] 比较列表中的两个元素,则引用相同)。这就解释了为什么当您尝试使用列表元素作为键创建字典时,最终得到的字典只有一个元素 - 因为所有列表元素都是相同的。

如您所愿,要创建 10 个不同的占位符张量,您应该改为执行以下操作:

inputs = [tf.placeholder(tf.float32, shape=(batch_size, input_size))
          for _ in xrange(10)]

如果您打印此列表的元素,您会看到每个元素都是具有不同名称的张量。


编辑: *您现在可以将 tuples 作为 feed_dict 的键传递,因为这些可以用作字典键。

【讨论】:

  • 不支持张量列表作为键,因此您必须将每个张量作为单独的键 @mrry,这仍然是真的吗?就我而言,我在 TensorFlow r0.11 中将 LSTMStateTuple 对象的元组作为 sess.run() 的键传递
  • 元组现在可以作为键使用,但是列表仍然会引发错误,因为 Python 列表不能用作字典键。我更新了答案以澄清。
  • 如果我提供多次迭代怎么办? ex) feed_dict={x:y for x,y in (nodes,inputs), node_another: input_another} #这不起作用
【解决方案3】:

feed_dict 可以通过预先准备字典来提供,如下所示

n = 10
input_1 = [tf.placeholder(...) for _ in range(n)]
input_2 = tf.placeholder(...)
data_1 = [np.array(...) for _ in range(n)]
data_2 = np.array(...)


feed_dictionary = {}
for i in range(n):
    feed_dictionary[input_1[i]] = data_1[i]
feed_dictionary[input_2] = data_2
sess.run(y, feed_dict=feed_dictionary)

【讨论】:

    猜你喜欢
    • 2017-12-21
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多