在TensorFlow中将列表馈入feed_dict
python
tensorflow
7
0

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

这是一个正确的例子:

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的Tensor(第一个维度为10)上创建,就不知道为什么要这样做。

由于您具有张量列表(而不是张量),因此无法将数据馈入此列表(但就我而言,我可以馈入张量)。

收藏
评论

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

第一个问题是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的键feed_dict ,因为它们可以用作字典键。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号