Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将Keras序列CNN的训练数据转换为正确的张量形状?_Python_Arrays_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python 如何将Keras序列CNN的训练数据转换为正确的张量形状?

Python 如何将Keras序列CNN的训练数据转换为正确的张量形状?,python,arrays,machine-learning,keras,deep-learning,Python,Arrays,Machine Learning,Keras,Deep Learning,我有一个图像像素数据的四维张量(红色(高度,宽度),绿色(高度,宽度),蓝色(高度,宽度),14000个示例)和一个CSV文件,其中包含每个图像具有的边界框的坐标(图像名称,X1,Y1,X2,Y2),它有14000行,每个示例一行 我如何将这些数据输入我的神经网络?目前,如果我尝试输入张量,它将通过14000个示例的整个数组,对一行(X1,Y1,X2,Y2){它应该通过一个数组对一行X1,Y1,X2,Y2} 你知道怎么解决这个问题吗 以下是代码和相关错误: train_csv = pd.read

我有一个图像像素数据的四维张量(红色(高度,宽度),绿色(高度,宽度),蓝色(高度,宽度),14000个示例)和一个CSV文件,其中包含每个图像具有的边界框的坐标(图像名称,X1,Y1,X2,Y2),它有14000行,每个示例一行

我如何将这些数据输入我的神经网络?目前,如果我尝试输入张量,它将通过14000个示例的整个数组,对一行(X1,Y1,X2,Y2){它应该通过一个数组对一行X1,Y1,X2,Y2}

你知道怎么解决这个问题吗

以下是代码和相关错误:

train_csv = pd.read_csv('datasets/training.csv').values
test_csv = pd.read_csv('datasets/test.csv').values

y_train = train_csv[:,[1,2,3,4]]   #done
x_train_names = train_csv[:,0]     #obtained names of images in array

#### load images into an array ####
X_train = []
path = "datasets/images/images/"
imagelist = listdir(path)
for i in range(len(x_train_names)):
img_name = x_train_names[i]
img = Image.open(path + str(img_name))
arr = array(img)
X_train.append(arr) 


#### building a very basic classifier, just to get some result ####
classifier = Sequential()
classifier.add(Convolution2D(64,(3,3),input_shape=(64,64,3), activation = 
'relu')) 
classifier.add(Dropout(0.2))
classifier.add(MaxPooling2D((4,4)))
classifier.add(Convolution2D(32,(2,2), activation = 'relu')) 
classifier.add(MaxPooling2D((2,2)))
classifier.add(Flatten())
classifier.add(Dense(16, activation = 'relu'))
classifier.add(Dropout(0.5))
classifier.add(Dense(4))
classifier.compile('adam','binary_crossentropy',['accuracy'])
classifier.fit(x=X_train,y=y_train, steps_per_epoch=80, batch_size=32, 
epochs=25)
错误:

ValueError:检查模型输入时出错:传递给模型的Numpy数组列表的大小不是模型预期的大小。预计将看到1个阵列,但得到了以下14000个阵列的列表:

[array([[[141, 154, 144],
         [141, 154, 144],
         [141, 154, 144],
         ...,
         [149, 159, 150],
         [150, 160, 151],
         [150, 160, 151]],

        [[140, 153, 143],
         […
编辑:我将所有图像转换为灰度,因此不会出现内存错误。这意味着我的X_列车应该沿通道数有一个维度(前面的RGB)。这是我编辑的代码:

y_train = train_csv[:,[1,2,3,4]]   #done
x_train_names = train_csv[:,0]     #obtained names of images in array

# load images into an array
path = "datasets/images/images/"
imagelist = listdir(path)

img_name = x_train_names[0]

X_train = np.ndarray((14000,img.height,img.width,1))

for i in range(len(x_train_names)):
img_name = x_train_names[i]
img = Image.open(path + str(img_name)).convert('L') 
##converting image to grayscale because I get memory error else 
X_train[i,:,:,:] = np.asarray(img)
ValueError:无法将输入数组从形状(480640)广播到形状(480640,1)


(在
X_列[i,:,:,:]=np.asarray(img)
line)

第一步始终是找出第一个卷积层需要的输入形状。的文档说明4D输入张量的预期形状为
[批次、高度、宽度、通道]

要加载数据,我们可以使用numpy数据数组。为此,我们应该知道要加载的图像数量以及图像的尺寸:

path = "datasets/images/images/"
imagelist = listdir(path)

img_name = x_train_names[0]
img = Image.open(path + str(img_name))

X_train = np.ndarray((len(imagelist),img.height,img.width,3))

for i in range(len(x_train_names)):
 img_name = x_train_names[i]
 img = Image.open(path + str(img_name))
 X_train[i,:,:,:] = np.asarray(img)
X_列张量的形状属性应给出:

print(X_train.shape)
> (len(x_train_names), img.height, img.width, 3)
编辑:

要以多个批次加载图像,可以执行以下操作:

#### Build and compile your classifier up here here ####

num_batches = 5
len_batch = np.floor(len(x_train_names)/num_batches).astype(int) 

X_train = np.ndarray((len_batch,img.height,img.width,3))

for batch_idx in range(num_batches):
    idx_start = batch_idx*len_batch
    idx_end = (batch_idx+1)*len_batch-1
    x_train_names_batch = x_train_names[idx_start:idx_end]

    for i in range(len(x_train_names_batch)):
        img_name = x_train_names_batch[i]
        img = Image.open(path + str(img_name))
        X_train[i,:,:,:] = np.asarray(img)

    classifier.fit(x=X_train,y=y_train, steps_per_epoch=num_batches, batch_size=len(x_train_names_batch), epochs=2)

第一步始终是找出第一个卷积层期望的输入形状。的文档说明4D输入张量的预期形状为
[批次、高度、宽度、通道]

要加载数据,我们可以使用numpy数据数组。为此,我们应该知道要加载的图像数量以及图像的尺寸:

path = "datasets/images/images/"
imagelist = listdir(path)

img_name = x_train_names[0]
img = Image.open(path + str(img_name))

X_train = np.ndarray((len(imagelist),img.height,img.width,3))

for i in range(len(x_train_names)):
 img_name = x_train_names[i]
 img = Image.open(path + str(img_name))
 X_train[i,:,:,:] = np.asarray(img)
X_列张量的形状属性应给出:

print(X_train.shape)
> (len(x_train_names), img.height, img.width, 3)
编辑:

要以多个批次加载图像,可以执行以下操作:

#### Build and compile your classifier up here here ####

num_batches = 5
len_batch = np.floor(len(x_train_names)/num_batches).astype(int) 

X_train = np.ndarray((len_batch,img.height,img.width,3))

for batch_idx in range(num_batches):
    idx_start = batch_idx*len_batch
    idx_end = (batch_idx+1)*len_batch-1
    x_train_names_batch = x_train_names[idx_start:idx_end]

    for i in range(len(x_train_names_batch)):
        img_name = x_train_names_batch[i]
        img = Image.open(path + str(img_name))
        X_train[i,:,:,:] = np.asarray(img)

    classifier.fit(x=X_train,y=y_train, steps_per_epoch=num_batches, batch_size=len(x_train_names_batch), epochs=2)

数据集中大约有50000个图像,使用此代码可以在
X\u train=np.ndarray((len(imagelist),img.height,img.width,3))处给我一个内存错误。
。我有16gb的RAM和64位Python,所以我不知道为什么我会得到这个。。你知道吗?你是在生成训练集的过程中还是在训练过程中耗尽了内存?我估计50000个64x64x3图像的总文件大小约为5 gb,对吗?然而,在向前传递期间,所需的存储器显著增加。尝试减少批处理大小或要素映射的数量。如果这还不够,您应该在给定时间仅将部分图像加载到训练集中。Keras还提供了一种更为复杂的方法,正是针对这种情况而设计的。还有一件事:将X_列张量明确地转换为uint8类型,如:
X_列=np.ndarray((len(imagelist),img.height,img.width,3),dtype=np.uint8)
我正在考虑将图像转换为灰度格式,Florian。我在执行代码时遇到了这个错误,我甚至无法到达培训/测试部分。我认为在创建阵列本身时存在内存问题。不管怎样,我编辑了一些代码来使用灰度,你能帮我吗?请看我编辑的答案。嗨,Sakazuki。对于灰度方法,您必须像这样重塑图像:
X\u train[i,:,:,:]=np.asarray(img)。重塑((img.height,img.width,1))
。如果这行得通,那就开始吧。但是,在灰度上操作时,可能会降低分类性能,因为您正在“丢弃”颜色信息。相反,您可以只加载多个较小批次的彩色图像。我将更新我的主要答案,为您提供一个例子。数据集中大约有50000张图像,使用此代码可以在
X_train=np.ndarray((len(imagelist),img.height,img.width,3))处给我一个MemoryError
。我有16gb的RAM和64位Python,所以我不知道为什么我会得到这个。。你知道吗?你是在生成训练集的过程中还是在训练过程中耗尽了内存?我估计50000个64x64x3图像的总文件大小约为5 gb,对吗?然而,在向前传递期间,所需的存储器显著增加。尝试减少批处理大小或要素映射的数量。如果这还不够,您应该在给定时间仅将部分图像加载到训练集中。Keras还提供了一种更为复杂的方法,正是针对这种情况而设计的。还有一件事:将X_列张量明确地转换为uint8类型,如:
X_列=np.ndarray((len(imagelist),img.height,img.width,3),dtype=np.uint8)
我正在考虑将图像转换为灰度格式,Florian。我在执行代码时遇到了这个错误,我甚至无法到达培训/测试部分。我认为在创建阵列本身时存在内存问题。不管怎样,我编辑了一些代码来使用灰度,你能帮我吗?请看我编辑的答案。嗨,Sakazuki。对于灰度方法,您必须像这样重塑图像:
X\u train[i,:,:,:]=np.asarray(img)。重塑((img.height,img.width,1))
。如果这行得通,那就开始吧。但是,在灰度上操作时,可能会降低分类性能,因为您正在“丢弃”颜色信息。相反,您可以只加载多个较小批次的彩色图像。我会更新我的主要答案,给你一个例子。