【问题标题】:Tensorflow (python): "ValueError: setting an array element with a sequence" in train_step.run(...)Tensorflow(python):train_step.run(...)中的“ValueError:设置带有序列的数组元素”
【发布时间】:2016-03-13 10:01:07
【问题描述】:

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

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)

我做错了什么?

编辑

问题似乎是我必须先评估batch_xs 中的张量,然后再将它们传递给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

即使按照以下答案中的建议进行操作,我也遇到了一些问题。我终于通过放弃张量并使用 numpy 数组来解决所有问题。

【问题讨论】:

    标签: python-2.7 tensorflow


    【解决方案1】:

    Operation.run()(也称为 Session.run()Tensor.eval())的 feed_dict 参数接受字典映射 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 是浮点数列表,TensorFlow 会透明地将其转换为一维 numpy 数组,因此您不需要转换此参数。

    编辑: mdaoust 在 cmets 中提出了一个有效点:如果您将数组列表传递给 np.array(因此作为 feed_dict 中的值),它将自动为 @ 987654340@ed,因此无需按照我的建议转换您的输入。相反,听起来您的列表元素的形状不匹配。尝试添加以下内容:

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

    ...在调用train_step.run() 之前,这应该会显示您是否有不匹配的情况。

    【讨论】:

    • np 像这样自动堆叠数组列表,所以我仍然押注大小不一致。 p=tf.placeholder(tf.float32,[2,10,10]);q = tf.identity(p);q.eval(feed_dict={p:[np.random.randn(10,10),np.random.randn(10,10)]})‌​.shape #==&gt; (2, 10, 10)
    • @mrry 有没有办法将 TF 张量提供给feed_dict?如您所知,我纯粹在 TF 中读取和解码图像,现在在喂食时遇到同样的问题
    • @HamedMP:目前无法将(符号)Tensor 作为feed_dict 中的值提供。这里的三个主要选择是:(i) 评估张量并传递它的值,(ii) 构建图形以便在原始表达式中使用 Tensor 的值,或者 (iii) 使用“队列”作为间接,评估Tensor 并将其加入队列;然后将原始表达式定义为dequeue 的函数而不是占位符。
    • 谢谢@mrry,我使用的是第一种方法。数据是图像,张量图像在 tensroboard 中正确显示,但是当我评估它们时,它们已损坏,训练和验证都没有从 10% 提高(比我以前使用 tf.Variable 的实现更糟糕,至少训练在改进。)我甚至尝试投射到 np.uin32,转置频道,.. 但没有奏效
    • @HamedMP:最好将其移至一个新问题。你能发布你尝试过的细节吗?
    【解决方案2】:

    此特定错误来自numpy。在维度不一致的序列上调用 np.array 会抛出它。

    >>> np.array([1,2,3,[4,5,6]])
    
    ValueError: setting an array element with a sequence.
    

    看起来它在tf 确保feed_dict 的所有元素都是numpy.arrays 的点上失败了。

    检查您的feed_dict

    【讨论】:

    • 谢谢!我在使用 hdf5 数据集中的图像数据时遇到了这个问题,其中每个图像都是不同的形状。
    • 对我来说,问题还在于图像具有不同的形状。
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 2023-03-16
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多