使3d图像适合深度学习模型

时间:2019-03-24 01:46:47

标签: image tensorflow keras deep-learning

我正在将图像预处理成Numpy阵列形状(28,28,3)。当我尝试拟合数据时,出现错误。如果我传递整个准备好的数据帧,则会收到错误ValueError:检查输入时出错:预期conv2d_20_input具有4个维,但数组的形状为(360,1)

当我传递一个值时,我得到的错误是:检查输入时出错:预期conv2d_16_input具有4个维,但是数组的形状为(28,28,3

我尝试重新处理数据。我尝试过单独放入模型并按1:1进行训练,但仍然无法正常工作。

要预处理的代码

from tensorflow.python.keras.preprocessing.image import load_img, img_to_array
def read_and_prep_images(img_paths):
    z = load_img(img_paths, target_size=(28,28))
    z= img_to_array(z)
    return z
df['arrays'] = df['filepath'].apply(read_and_prep_images)

模型创建

model = Sequential()

添加模型层

model.add(Conv2D(filters = 24, kernel_size = (5),padding = 'Same', 
              activation ='relu', input_shape = (28, 28,3)))

model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', 
                 activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation = "relu"))
model.add(Dropout(0.5))
model.add(Dense(10, activation = "softmax"))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

仔细检查形状

np.shape(df['arrays'].iloc[0])

(28,28,3)

准备数据

X_train, X_test, y_train, y_test = train_test_split(df.arrays, df.label, test_size=0.4, random_state=101)

拟合模型

model.fit(X_train, y_train, batch_size=100, epochs=4, validation_split=0.2)

模型应该合适,并且我可以对以前从未见过的新图像使用model.predict。

1 个答案:

答案 0 :(得分:0)

如果我传递整个准备好的数据帧,则会收到错误ValueError:检查输入时出错:预期conv2d_20_input具有4个维,但数组的形状为(360,1)

发生错误是因为df.arrays返回了一个数组数组。因此,如果您选择df.arrays.shape,它将是(360,)而不是(360,28,28,3)。因此,您需要首先删除嵌套。一种方法是:

X = np.zeros((len(df.arrays), *df.arrays[0].shape))
for i in range(len(df.arrays)):
    X[i] = df.arrays[i]

X现在可以传递给model.fit。

当我传递一个值时,我得到的错误是:检查输入时出错:预期conv2d_16_input具有4维,但数组的形状为(28,28,3)

这很容易,只需添加一个批次尺寸即可。传递df.arrays [0] [None]而不是df.arrays [0]。

>>> df.arrays[0].shape
(28, 28, 3)
>>> df.arrays[0][None].shape
(1, 28, 28, 3)