如何将Keras Sequential CNN的训练数据调整为正确的张量形状?

我有一个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)

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注