我正在尝试将列表传递到feed_dict,但是这样做很麻烦。说我有:
feed_dict
inputs = 10 * [tf.placeholder(tf.float32, shape=(batch_size, input_size))]
输入被输入到outputs我要计算的某些函数中。因此要在tensorflow中运行它,我创建了一个会话并运行以下命令:
outputs
sess.run(outputs, feed_dict = {inputs: data}) #data is my list of inputs, which is also of length 10
但是我得到一个错误,TypeError: unhashable type: 'list'. 但是,我可以像这样传递数据元素:
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
for
tensorflow.python.framework.ops.Tensor at 0x107594a10
有两个问题在这里引起问题:
第一个问题是该Session.run()呼叫仅接受少量类型作为的键feed_dict。特别是, 不 支持将张量列表用作键,因此您必须将每个张量作为单独的键放置。*一种方便的方法是使用字典理解:
Session.run()
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 * [tf.placeholder(...)]
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,因为它们可以用作字典键。