【问题标题】:Tensorflow ValueError: setting an array element with a sequence with imagesTensorflow ValueError:使用带有图像的序列设置数组元素
【发布时间】:2017-07-11 14:45:16
【问题描述】:

我浏览了许多论坛站点,试图找出解决方案,但找不到。

我正在尝试将 Tensorflow(Python 3,Win 10 64 位)与我自己的一组图像一起使用。当我运行它时,我得到一个 ValueError。具体来说:

Traceback (most recent call last):
  File "B:\Josh\Programming\Python\imgpredict\predict.py", line 62, in <module>
    sess.run(train_step, feed_dict={imgs:batchX, lbls: batchY})
  File "C:\Users\Josh\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\client\session.py", line 789, in run
    run_metadata_ptr)
  File "C:\Users\Josh\AppData\Local\Programs\Python\Python36\lib\site-packages\tensorflow\python\client\session.py", line 968, in _run
    np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
  File "C:\Users\Josh\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\core\numeric.py", line 531, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence.

我的代码是:

import tensorflow as tf
import numpy as np
import os
import sys
import cv2


content = [] # Where images are stored
labels_list = []


########## File opening function
with open("data/cats/files.txt") as ff:
    for line in ff:
        line = line.rstrip()
        content.append(line)
#################################

########## Labels opening function
with open("data/cats/labels.txt") as fff:
    for linee in fff:
        linee = linee.rstrip()
        labels_list.append(linee)
    labels_list = np.array(labels_list)
###############################


def create_batches(batch_size):
    images1 = []
    for img1 in content:
        thedata = cv2.imread(img1)
        thedata = tf.contrib.layers.flatten(thedata)
        images1.append(thedata)
    images1 = np.asarray(images1)

    images1 = np.array(images1)

    while(True):
        for i in range(0,298,10):
            yield(images1[i:i+batch_size],labels_list[i:i+batch_size])


imgs = tf.placeholder(dtype=tf.float32,shape=[None,262144])
lbls = tf.placeholder(dtype=tf.float32,shape=[None,10])

W = tf.Variable(tf.zeros([262144,10]))
b = tf.Variable(tf.zeros([10]))

y_ = tf.nn.softmax(tf.matmul(imgs,W) + b)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(lbls * tf.log(y_),reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy)

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for i in range(10000):#########################################
    for (batchX,batchY) in create_batches(10):
        for inn, imgs in enumerate(batchX):
            batchX[inn] = imgs.eval()
        sess.run(train_step, feed_dict={imgs:batchX, lbls: batchY})

correct_prediction = tf.equal(tf.argmax(y_,1),tf.argmax(lbls,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

print(sess.run(accuracy, feed_dict={imgs:content, lbls:labels_list}))

我不知道错误是来自我的图片还是我的标签。我从其他 SO 问题、Reddit、Google Plus、GitHub 问题等中尝试了很多建议,但无济于事。我的项目的 GitHub 链接是:https://github.com/supamonkey2000/jm-uofa

项目文件夹为“imgpredict”

任何帮助表示赞赏。提前致谢

【问题讨论】:

    标签: python image tensorflow


    【解决方案1】:

    在这种情况下,我认为您看到此错误是因为您在运行训练时将 tensorflow 对象传递给 feed_dict。由于您使用的扁平化方法,它可能是一个 tensorflow 对象:

    thedata = tf.contrib.layers.flatten(thedata)
    

    这将返回一个扁平的张量(更多信息在docs),由于某种原因没有被正确评估。

    按照answer 解决此问题,您需要为 feed dict 提供一个 numpy 数组。你可以试试:

    thedata.flatten()
    

    这会将数组展平为向量。我试过了,它至少摆脱了错误。

    除此之外,就像Ofer Sadan 指出的那样,您的方法存在一些基本问题。对我来说最明显的一个是您正在将权重矩阵初始化为图像大小(512 x 512 = 262144),但是由于您正在加载 3 通道图像(RGB 彩色图像),您最终会得到一个三倍于该大小的扁平数组(512 x 512 x 3 个通道 = 786432)所以无论如何训练都会失败。如果颜色对您的训练数据不重要,请尝试转换为灰度 (thedata = cv2.cvtColor(thedata, cv2.COLOR_BGR2GRAY)。

    【讨论】:

    • 感谢您的建议,我今天上班时一定会尝试一下。我知道我的 262144 值有问题......
    • 完美,这消除了第一个错误!现在进入下一个错误...感谢您的帮助:)
    【解决方案2】:

    对于这不是对错误的完整答案,我深表歉意,但我发现您的代码有很多问题可能会生成它。

    首先,使用create_batches 函数。您使用images1 的列表,thedata 的张量,将所有这些张量附加到列表中,然后将该列表转换为 numpy 数组。这是非常糟糕的做法。

    那里的第二个问题 - 它应该是yield 图像和标签,但标签根本没有在该函数中处理并且来自全局值。因此,我认为没有理由假设您这样做时它们甚至与图像匹配:

    yield(images1[i:i+batch_size],labels_list[i:i+batch_size])
    

    毕竟,您的batchX 似乎是一个张量列表,因此您再次将它们中的每一个转换为一个数组(使用imgs.eval())。毕竟,上帝只知道现在数组的实际形状是什么,而错误本身通常表明 batchX 不是要从列表转换为数组的正确“矩形”形状(例如如果其中一个元素是特定长度的数组,而其他元素是不同长度的数组)。

    我的建议,重写你的函数,简化它,不要在其中使用张量,也不要在其中使用普通列表。它应该返回一个简单的 numpy 数组,其形状适合 sess.run(train_step, feed_dict={imgs:batchX, lbls: batchY})

    【讨论】:

    • 感谢您的建议,我会在上班时修复我的代码
    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2011-06-08
    相关资源
    最近更新 更多