python - 如何将 Keras Sequential CNN 的训练数据转换为正确的张量形状?

标签 python arrays machine-learning keras deep-learning

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

如何将这些数据输入我的神经网络?目前,如果我尝试输入张量,它会针对一行 (X1,Y1,X2,Y2) 传递 14000 个示例的整个数组{它应该为一行 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_train 沿着 channel 数(之前是 RGB)应该有 1 个维度。这是我编辑的代码:

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:无法将输入数组从形状 (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 张量的形状属性应该为您提供:

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)

关于python - 如何将 Keras Sequential CNN 的训练数据转换为正确的张量形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54607056/

相关文章:

python - doc2vec 获取最相似的文档

java - Python - 集成 Java GUI 和 python 代码的最佳方式

java - 使用 Itext 将 Pdf 页面转换为字节数组

machine-learning - Tensorflow 多 GPU MNIST 分类器 : low accuracy

python - 导入自己的数据,例如 MNIST 或 CIFAR10 load_data()

python - Openshift 从 Django 应用中查找静态文件

arrays - Swift Array Extension 用 n-previous 值的总和替换索引 n 的值

c++ - 将字符从 char 数组复制到 char 数组

matlab - 线性判别分析matlab

python - 如何将数据集拆分为训练集和验证集并保持类之间的比例?