小编典典

在TensorFlow中将列表馈入feed_dict

python

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


阅读 219

收藏
2020-12-20

共1个答案

小编典典

有两个问题在这里引起问题:

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

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

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

若要按预期创建10个不同的占位符张量,应改为执行以下操作:

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

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


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

2020-12-20