Tensorflow(python):train_step.run(…)中的“ ValueError:设置具有序列的数组元素”
python-2.7
tensorflow
4
0

我正在尝试实现使用我自己的图像集训练的简单逻辑回归模型,但是当我尝试训练模型时却出现此错误:

Traceback (most recent call last):
File "main.py", line 26, in <module>
model.entrenar_modelo(sess, training_images, training_labels)
File "/home/jr/Desktop/Dropbox/Machine_Learning/TF/Míos/Hip/model_log_reg.py", line 24, in entrenar_modelo
train_step.run({x: batch_xs, y_: batch_ys})
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1267, in run
_run_using_default_session(self, feed_dict, self.graph, session)
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2763, in _run_using_default_session
session.run(operation, feed_dict)
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 334, in run
np_val = np.array(subfeed_val, dtype=subfeed_t.dtype.as_numpy_dtype)
ValueError: setting an array element with a sequence.

我正在提供给train_step.run({x: batch_xs, y_: batch_ys})是这样的:

  • batch_xs:表示100x100图像(10,000个长张量)的张量对象的列表
  • batch_ys:标签列表为浮点数(1.0或0.0)

我究竟做错了什么?提前谢谢!

编辑1 :它接缝的问题是我必须在将batch_xs的张量传递给train_step.run(...)之前对其进行train_step.run(...) 。我以为run方法可以解决这个问题,但是我想我错了?无论如何,所以一旦我在调用函数之前这样做了:

for i, x in enumerate(batch_xs):
    batch_xs[i] = x.eval()
    #print batch_xs[i].shape
    #assert all(x.shape == (100, 100, 3) for x in batch_xs)
# Now I can call the function

编辑2 :即使按照下面的答案建议,我也遇到了几个问题。最后,我放弃了张量并使用了numpy数组来修复所有问题。

希望这对别人有帮助

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

Operation.run()feed_dict参数(以及Session.run()Tensor.eval() )接受将Tensor对象(通常为tf.placeholder()张量)映射到numpy数组(或可以简单转换的对象)的字典到一个numpy数组)。

在您的情况下,您传递的是batch_xs ,它是numpy数组的列表,而TensorFlow不知道如何将其转换为numpy数组。假设batch_xs定义如下:

batch_xs = [np.random.rand(100, 100),
            np.random.rand(100, 100),
            ...,                       # 29 rows omitted.
            np.random.rand(100, 100)]  # len(batch_xs) == 32.

我们可以使用以下方法将batch_xs转换为32 x 100 x 100数组:

# Convert each 100 x 100 element to 1 x 100 x 100, then vstack to concatenate.
batch_xs = np.vstack([np.expand_dims(x, 0) for x in batch_xs])
print batch_xs.shape
# ==> (32, 100, 100) 

请注意,如果batch_ys是浮点数列表,则batch_ys将透明地将其转换为一维numpy数组,因此您无需转换此参数。

编辑:mdaoust使一个有效点意见:如果你传递数组列表为np.array (因此如在价值feed_dict ),它会自动vstack版,所以应该不需要你的输入转换如我所建议。相反,听起来您的列表元素的形状不匹配。尝试添加以下内容:

assert all(x.shape == (100, 100) for x in batch_xs)

...在调用train_step.run() ,这应该显示您是否不匹配。

收藏
评论

这个特殊的错误来自numpy 。在尺寸不一致的序列上调用np.array可能会抛出该错误。

>>> np.array([1,2,3,[4,5,6]])

ValueError: setting an array element with a sequence.

看起来在tf确保feed_dict所有元素都是numpy.array

检查您的feed_dict

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

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号