ValueError:检查输入时出错:conv2d_1_输入应有4个维度,但得到的数组形状为(454,512,512)

2024-04-26 07:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我用这段代码在keras中生成数据集。但当我实现我的代码时,它会产生以下错误:

ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (454, 512, 512)

我也解决不了。你能告诉我有什么问题吗?我在网络中使用之前扩展了维度,但它不起作用!我找了好几天都找不到答案,时间不够,你能尽快回答我吗

import os,cv2
import numpy as np
import matplotlib.pyplot as plt

from sklearn.utils import shuffle
from sklearn.cross_validation import train_test_split

from keras import backend as K
#K.set_image_dim_ordering('th')

from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.optimizers import SGD,RMSprop,adam

#%%

PATH = os.getcwd()
# Define data path
data_path = r"E:\PhD\thesis\deepwatermark\databasetest\train"
data_dir_list = os.listdir(data_path)

img_rows=512
img_cols=512
num_channel=1
num_epoch=20

# Define the number of classes
num_classes = 7

labels_name={'CRP':0,'GF':1,'GN':2,'JPG':3,'MED':4,'ROT':5,'SP':6}

img_data_list=[]
labels_list = []

for dataset in data_dir_list:
    img_list=os.listdir(data_path+'/'+ dataset)
    print ('Loading the images of dataset-'+'{}\n'.format(dataset))
    label = labels_name[dataset]
    for img in img_list:
        input_img=cv2.imread(data_path + '/'+ dataset + '/'+ img )
        input_img=cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
        input_img_resize=cv2.resize(input_img,(512,512))
        img_data_list.append(input_img_resize)
        labels_list.append(label)

img_data = np.array(img_data_list)
img_data = img_data.astype('float32')
img_data /= 255
print (img_data.shape)

labels = np.array(labels_list)
# print the count of number of samples for different classes
print(np.unique(labels,return_counts=True))
# convert class labels to on-hot encoding
Y = np_utils.to_categorical(labels, num_classes)

#Shuffle the dataset
x,y = shuffle(img_data,Y, random_state=2)
# Split the dataset
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2)
img_data= np.expand_dims(img_data, axis=4)** 
print (img_data.shape)


# Defining the model
input_shape=img_data[0].shape

model = Sequential()

model.add(Convolution2D(32, 3,3,border_mode='same',input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
#model.add(Convolution2D(64, 3, 3))
#model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

#sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
#model.compile(loss='categorical_crossentropy', optimizer=sgd,metrics=["accuracy"])
model.compile(loss='categorical_crossentropy', optimizer='rmsprop',metrics=["accuracy"])

# Viewing model_configuration

model.summary()
model.get_config()
model.layers[0].get_config()
model.layers[0].input_shape         
model.layers[0].output_shape            
model.layers[0].get_weights()
np.shape(model.layers[0].get_weights()[0])
model.layers[0].trainable

#%%
# Training
hist = model.fit(X_train, y_train, batch_size=16, nb_epoch=num_epoch, verbose=1, validation_data=(X_test, y_test))

我的生成器新代码在这里,你看到什么问题了吗?我的数据集和以前一样。在

^{pr2}$

但当我实施它时,我又收到了这个错误:

resourceWesterError:OOM分配形状为[32,32512512]且类型为float on的张量时为OOM/作业:本地主机/副本:0/任务:0/设备:GPU:0由分配器GPU_0_bfc [[节点:conv2d_1/convolation=conv2d[T=DT_FLOAT,data_format=”NCHW“,膨胀=[1,1,1,1],padding=”相同“,跨距=[1,1,1,1],使用_-cudn_on_gpu=true,_device=”/作业:本地主机/副本:0/任务:0/设备:GPU:0“](conv2d_1/卷积-0-transposenhwcontchw-layoutooptimizer,conv2d_1/kernel/read)]]


Tags: fromtestimportaddimginputdatalabels
1条回答
网友
1楼 · 发布于 2024-04-26 07:21:09
    for img in img_list:
        input_img=cv2.imread(data_path + '/'+ dataset + '/'+ img )
        input_img=cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
        input_img_resize=cv2.resize(input_img,(512,512))
     ->input_img_resize = np.expand_dims(input_img_resize, axis=-1)
        img_data_list.append(input_img_resize)
        labels_list.append(label)

这将使您的所有数组512x512x1,这应该可以做到这一点,并最终得到一个形状(454,512,512,1)的数组。你确定要用灰度图像吗?在

另一件事是这段代码

^{pr2}$

在你已经声明了x\u train之后,你将另一个维度应用到你的img\u数据中,最后你输入了x\u train,它没有被扩展,因此产生了错误。如果您在开始时这样做,并在最后删除扩展,那么您的代码应该可以工作。在

编辑OOM

我建议为OOM问题创建一个单独的问题,以便更多的人看到它。可能的问题是图像的大小和批量大小。将图像大小减小为64 x 64,并将批大小更改为5。如果这仍然会导致错误,那么也可以尝试踢出这个密集的层。在

model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))

如果这些减少仍然导致错误,那么我有以下问题:你运行的是GPU/CPU吗,哪一个?在

我重复一遍:代码很好,也许只需要做一些修改。在

相关问题 更多 >