我依赖于上面提到的代码here,但是进行了少量修改。我的版本如下:
import numpy as np
import _pickle as cPickle
from PIL import Image
import sys,os
pixels = []
labels = []
traindata = []
data=[]
directory = 'C:\\Users\\abc\\Desktop\\Testing\\images'
for root, dirs, files in os.walk(directory):
for file in files:
floc = file
im = Image.open(str(directory) + '\\' + floc)
pix = np.array(im.getdata())
pixels.append(pix)
labels.append(1)
pixels = np.array(pixels)
labels = np.array(labels)
traindata.append(pixels)
traindata.append(labels)
traindata = np.array(traindata)
# do the same for validation and test data
# put all data and labels into 'data' array
cPickle.dump(data,open('data.pkl','wb'))
当我运行代码时,我得到以下内容:
Traceback (most recent call last):
File "pickle_data.py", line 24, in <module>
traindata=np.array(traindata)
ValueError: could not broadcast input array from shape (22500,3) into shape (1)
我该如何解决这个问题?
感谢。
答案 0 :(得分:1)
要理解traindata
的结构,我将pixels.append(pix)
替换为pixels.append(pix[np.ix_([1,2,3],[0,1,2])])
以获得一些玩具示例。然后我得到traindata
[array([[[16, 13, 15],
[16, 13, 15],
[16, 13, 15]]]), array([1])]
当您尝试将traindata
转换为numpy数组时,您会收到错误,因为它包含不同大小的子数组。你可以将每个子数组保存在一个单独的numpy数组中,或者你可以这样做:
traindata = np.array([traindata[0][0],traindata[1]], dtype=object)
通过使用dtype=object
,您可以创建由不同大小的元素组成的numpy数组。