在TensorFlow中将列表提供给feed_dict

时间:2015-11-13 01:47:05

标签: python tensorflow

我正在尝试将列表传递给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

3 个答案:

答案 0 :(得分:43)

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

第一个问题是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(...)]语法创建了一个包含十个元素的列表,其中每个元素都是 相同的张量对象 (即具有相同的name属性,相同的id属性,如果使用inputs[i] is inputs[j]比较列表中的两个元素,则引用相同。这解释了为什么当您尝试使用列表元素作为键创建字典时,您最终会得到一个包含单个元素的字典 - 因为所有列表元素都是相同的。

要按照您的意图创建10个不同的占位符张量,您应该执行以下操作:

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

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

编辑: * 您现在可以将元组作为feed_dict的键传递,因为它们可以用作字典密钥。

答案 1 :(得分:5)

这是一个正确的例子:

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)的张量。不知道为什么要这样做,如果你可以在Tensor上创建等级3(第一个维度是10)。

因为你有一个张量列表(而不是张量),你无法将数据提供给这个列表(但在我的情况下,我可以提供给我的张量)。

答案 2 :(得分:1)

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)