【问题标题】:ValueError: setting an array element with a sequence when using feed_dict in TensorFlowValueError:在 TensorFlow 中使用 feed_dict 时使用序列设置数组元素
【发布时间】:2016-08-13 23:26:29
【问题描述】:

我在执行训练时尝试输入包含正确标签的张量。

整个训练数据集的正确标签包含在一个从 numpy 数组转换而来的张量中:

numpy_label = np.zeros((614,5),dtype=np.float32)

for i  in range(614):
    numpy_label[i,label_numbers[i]-1] = 1

# Convert to tensor
y_label_all = tf.convert_to_tensor(numpy_label,dtype=tf.float32)

我有一个占位符用于每个批次的正确标签:

images_per_batch = 5
y_label = tf.placeholder(tf.float32,shape=[images_per_batch,5])

在每个训练步骤中,我将y_label_all 的相应部分切片为y_,并希望将其输入为y_label

for step in range(100):

    # Slice correct labels for current batch
    y_ = tf.slice(y_label_all,[step,0],[images_per_batch,5])

    # Train
    _, loss_value = sess.run([train_step,loss],feed_dict={y_label:y_})

这会产生错误:

_, loss_value = sess.run([train_step,loss],feed_dict={y_label:y_})
  File "/usr/local/lib/python2.7/dist-    packages/tensorflow/python/client/session.py", line 357, in run
np_val = np.array(subfeed_val, dtype=subfeed_t.dtype.as_numpy_dtype)
ValueError: setting an array element with a sequence.

变量y_y_label的形状:

#y_: 
Tensor("Slice:0", shape=TensorShape([Dimension(5), Dimension(5)]), dtype=float32)

#y_label: 
Tensor("Placeholder:0", shape=TensorShape([Dimension(5), Dimension(5)]), dtype=float32)

我不明白出了什么问题?显然这与 numpy 有关 - 但现在我已将 numpy 数组转换为张量,这会影响什么吗?

非常感谢您的帮助和洞察力。谢谢!

【问题讨论】:

标签: python arrays numpy tensorflow


【解决方案1】:

问题是 feed_dict 必须与 numpy 数组兼容。

您的代码会产生这样的结果

np.array(<tf.Tensor 'Slice_5:0' shape=(5, 5) dtype=float32>, dtype=np.float32)

在 numpy 中失败并出现上述神秘错误。要修复它,您需要将 Tensor 转换为 numpy,如下所示

for step in range(100):

    # Slice correct labels for current batch
    y_ = tf.slice(y_label_all,[step,0],[images_per_batch,5])
    y0 = sess.run([y_])

    # Train
    _, loss_value = sess.run([train_step,loss],feed_dict={y_label:y0})

【讨论】:

  • 一个观察:如果您在训练循环中调用tf.slice(),性能可能会非常差,因为它会在每次迭代中向图中添加节点。相反,您应该为当前步骤定义一个tf.placeholder(),就该占位符定义一个tf.slice(),并在每个步骤中输入该步骤的值(而不是已经在图表中的标签数据)迭代。
  • @mrry 关于那个....想知道我们是否应该让这个用例快速而不是让用户更加努力地考虑使用占位符重构事物
  • @mrry 谢谢!是的,它似乎运行有点慢。但是,我不明白您所说的“...单个tf.slice() 就占位符而言是什么意思,并在每个中输入步骤的值(而不是图中已经存在的标签数据)迭代。”你能详细说明一下吗?
猜你喜欢
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多