我正在将图像预处理成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])
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。
答案 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)