python - 检查输入时出错:预期 conv2d_1_input 有 4 个维度,但得到了形状为 (16, 1) 的数组
问题描述
当我尝试使用 VGG-16 模型拟合包含图像 ndarrays 的数组时,出现错误:“ValueError:检查输入时出错:预期 conv2d_14_input 具有 4 个维度,但得到的数组具有形状 (16, 1)”。知道如何解决这个问题吗?
我已经看到有很多关于这个类似问题的问题,但是按照这些问题的答案对我不起作用。例如,我尝试通过以下方式调整 X_train 的形状:X_train.values.reshape([-1,266,472,3]),但它回答错误,它无法将大小为 16 的数组重新整形为形状 (266,472, 3)。
信息:
X 形状 = (20,)
图像形状 = (472,266,3)
CNN 中的 input_shape = (472,266,3)
下面是打印(X)
0 [[[19, 17, 20], [19, 17, 20], [19, 17, 20], [2...
1 [[[15, 13, 16], [15, 13, 16], [15, 13, 16], [1...
2 [[[16, 14, 17], [15, 13, 16], [15, 13, 16], [1...
3 [[[13, 11, 14], [13, 11, 14], [12, 10, 13], [1...
4 [[[11, 9, 12], [11, 9, 12], [11, 9, 12], [11, ...
5 [[[14, 12, 15], [14, 12, 15], [14, 12, 15], [1...
6 [[[11, 9, 12], [11, 9, 12], [11, 9, 12], [11, ...
7 [[[13, 11, 14], [13, 11, 14], [12, 10, 13], [1...
8 [[[13, 11, 14], [12, 10, 13], [11, 9, 12], [11...
9 [[[12, 10, 13], [12, 10, 13], [12, 10, 13], [1...
10 [[[12, 10, 13], [12, 10, 13], [12, 10, 13], [1...
11 [[[12, 10, 13], [12, 10, 13], [12, 10, 13], [1...
12 [[[18, 16, 19], [18, 16, 19], [17, 15, 18], [1...
13 [[[18, 16, 19], [17, 15, 18], [16, 14, 17], [1...
14 [[[9, 7, 10], [10, 8, 11], [10, 8, 11], [11, 9...
15 [[[24, 22, 25], [23, 21, 24], [23, 21, 24], [2...
16 [[[21, 19, 22], [21, 19, 22], [20, 18, 21], [2...
17 [[[20, 18, 21], [20, 18, 21], [21, 19, 22], [2...
18 [[[12, 10, 13], [12, 10, 13], [12, 10, 13], [1...
19 [[[11, 9, 12], [11, 9, 12], [11, 9, 12], [11, ...
Name: Labeled Data, dtype: object
这是我的代码:
#Import Data
dataset = pd.read_csv('/content/gdrive/My Drive/CNN-VGG16/lowres.csv')
#Category Label
dataset["Label"] = dataset["Label"].astype("category")
dataset["Label_category"] = dataset["Label"].cat.codes
#Use specific columns for data
X = dataset['Labeled Data']
y = dataset["Label_category"]
#URL images to ndarray function
def url_to_ndarray(url):
ndarray = io.imread(url)
return ndarray
#Replaces url with ndarray
for i, data in enumerate(X):
X[i] = url_to_ndarray(data)
#Splitting data into training and validation
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)
#VGG-16 Archiitecture
def NewVGG16():
model = Sequential()
model.add(Conv2D(64,(3,3),input_shape=input_shape,padding='same',activation='relu'))
model.add(Conv2D(64,(3,3),activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(128,(3,3),activation='relu',padding='same'))
model.add(Conv2D(128,(3,3),activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(56,(3,3),activation='relu',padding='same'))
model.add(Conv2D(256,(3,3),activation='relu',padding='same'))
model.add(Conv2D(256,(3,3),activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(512,(3,3),activation='relu',padding='same'))
model.add(Conv2D(512,(3,3),activation='relu',padding='same'))
model.add(Conv2D(512,(3,3),activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(512,(3,3),activation='relu',padding='same'))
model.add(Conv2D(512,(3,3),activation='relu',padding='same'))
model.add(Conv2D(512,(3,3),activation='relu',padding='same'))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
model.add(Flatten())
model.add(Dense((4096),activation = 'relu'))
model.add(Dense((4096),activation = 'relu'))
model.add(Dense((1000),activation='softmax'))
return model
#Create and Compile model
model = NewVGG16()
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
#Fit Model
model.fit(X_train,y_train,batch_size = 32, verbose=1)