何你把多个数组放入Tensorflow

时间:2018-04-06 19:09:02

标签: python tensorflow neural-network deep-learning

我正在努力训练这种张量流图像识别。我正在为它提供两个单独的文件夹,其中包含完整的图像,但它不起作用,我认为它是一个数组错误。我之前已经运行了一个充满图像的文件夹,当我切换到两个文件夹并设计了我开始得到错误的架构时,它运行良好。我觉得它可能是这样的事实,他们我加倍标签,但我不确定。寻找所有建议,但记住我对神经网络/深度学习和python都很新,但非常感谢帮助。

import cv2
import numpy as np
import os
from random import shuffle
from tqdm import tqdm

CCW_DIR = 'C:\\Users\\cward\\Desktop\\images\\gz2\\ccw'
CW_DIR = 'C:\\Users\\cward\\Desktop\\images\\gz2\\cw'
IMG_SIZE = 50
LR = 1e-3

MODEL_NAME = 'dogsvscats-{}-{}.model'.format(LR, '2conv-basic')

def label_img(imgCW):
    #word_label = img.split('.')[-3]
    return[1,0]
    #word_label == 'cw': return[0,1]
def label_img(imgCCW):
    return[0,1]

def create_train_data():
    training_data = []
    for imgCCW in tqdm(os.listdir(CCW_DIR)):
        labelCCW = label_img(imgCCW)
        path = os.path.join(CCW_DIR, imgCCW)
        img = cv2.resize(cv2.imread(path, cv2.IMREAD_GRAYSCALE), (IMG_SIZE,IMG_SIZE))
        training_data.append([np.array(imgCCW), np.array(labelCCW)])
    for imgCW in tqdm(os.listdir(CW_DIR)):
        labelCW = label_img(imgCW)
        path = os.path.join(CW_DIR, imgCW)
        img = cv2.resize(cv2.imread(path, cv2.IMREAD_GRAYSCALE), (IMG_SIZE,IMG_SIZE))
        training_data.append([np.array(imgCW), np.array(labelCW)])
    shuffle(training_data)
    np.save('train_data.npy', training_data)
    return training_data

train_data = create_train_data()

这是我在程序运行两个图像文件夹后得到的错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-44-40719067ea74> in <module>()
----> 1 train_data = create_train_data()

<ipython-input-42-fa8590694b2d> in create_train_data()
     12         training_data.append([np.array(imgCW), np.array(labelCW)])
     13     shuffle(training_data)
---> 14     np.save('train_data.npy', training_data)
     15     return training_data

~\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\lib\npyio.py in save(file, arr, allow_pickle, fix_imports)
    507 
    508     try:
--> 509         arr = np.asanyarray(arr)
    510         format.write_array(fid, arr, allow_pickle=allow_pickle,
    511                            pickle_kwargs=pickle_kwargs)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\core\numeric.py in asanyarray(a, dtype, order)
    542 
    543     """
--> 544     return array(a, dtype, copy=False, order=order, subok=True)
    545 
    546 

ValueError: setting an array element with a sequence

对不起这个糟糕的蟒蛇我很难接受这种语言。感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您的问题中出现错误,因为training_data是numpy数组的列表,而numpy.save()只能保存numpy数组。我建议您在保存之前堆叠这些数组numpy.stack(),但另一个问题是即使training_data的元素都是列表。

通常的方法是使用一个numpy数组来保存训练数据,另一个用于标记。 (请注意,numpy也可以随numpy.random.shuffle进行随机播放,但要小心保持图像和标签同步。)然后单独保存,或与numpy.savez一起保存。

一个简单的解决方法是使用Python Pickle来保存(以后加载)数据,这些数据可以处理各种对象,而不仅仅是数组,但速度要慢得多,根据您的数据大小,这可能是也可能不是您的一个因素。

单独注释:定义label_img函数两次将导致第二个函数运行。很像

a = 5
a = 256

将导致a的值为256。