我有一个4维的图像像素数据张量(红色(高度,宽度),绿色(高度,宽度),蓝色(高度,宽度),14000个样本),还有一个CSV文件,包含每个图像的边界框坐标,即(图像名称,X1,Y1,X2,Y2),它也包含14000行,每个样本一行。
我如何将这些数据输入到我的神经网络中?目前,如果我尝试输入张量,它会将整个14000个样本的数组与一行(X1,Y1,X2,Y2)进行匹配(它应该是一行x1,y1,x2,y2对应一个数组)。
有什么办法可以解决这个问题吗?
这是代码和相关的错误信息:
train_csv = pd.read_csv('datasets/training.csv').valuestest_csv = pd.read_csv('datasets/test.csv').valuesy_train = train_csv[:,[1,2,3,4]] #donex_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_train应该在通道数上只有一维(之前是RGB)。这是我编辑后的代码:
y_train = train_csv[:,[1,2,3,4]] #donex_train_names = train_csv[:,0] #obtained names of images in array# load images into an arraypath = "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: 无法将输入数组从形状(480,640)广播到形状(480,640,1)
(在X_train[i,:,:,:] = np.asarray(img)
这一行)
回答:
第一步总是要找出你的第一个卷积层期望的输入形状。tf.nn.conv2d的文档指出,4D输入张量的期望形状是[batch, in_height, in_width, in_channels]
。
为了加载数据,我们可以使用numpy ndarray。为此,我们应该知道你想要加载的图像数量,以及图像的尺寸:
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_train张量的shape属性应该会给你这样的结果:
print(X_train.shape)> (len(x_train_names), img.height, img.width, 3)
编辑:
要以多个批次加载图像,你可以这样做:
#### 在这里构建和编译你的分类器 ####num_batches = 5len_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)