在 TensorFlow 中将列表输入 feed_dict 的问题
Issue feeding a list into feed_dict in 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
这是一个正确的例子:
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)。
因为你有一个张量列表(而不是张量),你不能将你的数据提供给这个列表(但在我的例子中我可以提供我的张量)。
这里有两个问题:
第一个问题是 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可以通过预先准备字典来提供
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)
我正在尝试将列表传递到 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
这是一个正确的例子:
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)。
因为你有一个张量列表(而不是张量),你不能将你的数据提供给这个列表(但在我的例子中我可以提供我的张量)。
这里有两个问题:
第一个问题是 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可以通过预先准备字典来提供
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)