python - ValueError:输入 0 与层 conv2d_1 不兼容:预期 ndim=4,发现 ndim=3
问题描述
在询问了已经提出的关于这个问题的问题之后,我继续提出它。我试图将字母从 A 分类到 D。所有输入图像都是 64x64 和灰色。
我的 CNN 的第一层是:
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape = input_shape, activation = 'relu'))
input_shape
它来自:
# Define the number of classes
num_classes = 4
labels_name={'A':0,'B':1,'C':2,'D':3}
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,(128,128))
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(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)
#Defining the model
input_shape=img_data[0].shape
print(input_shape)
解决方案
Conv2d 期望输入形状(batchsize、w、h、过滤器)。
您需要在 conv 层之前添加一个 reshape 以适应数据:
model.add(Reshape((64, 64, 1)))
这会将您的模型尺寸设置为 [None, 64,64,1] 并且对于 Conv2d 应该没问题。
推荐阅读
- java - 如何从 getMetaData.getColumns() 返回可滚动的结果集?
- parallel-processing - 具有动态数量的并行消费者的 Kafka 工作队列
- java - 如何使用 Selenium Webdriver 和 java 从登录页面上的图像徽标中获取文本
- module - How can i get a list of modules
- python - How to avoid hangings when scraping JSON formatted data from API URL using Python
- php - Use different thumbnails size for an specific "archive page" of a category in woocommerce
- user-interface - 如何在 pyqt GUI(QTdesigner)中显示“运行”控制台?
- python - TensorFlow 中的变量冲突
- python - 如何使用 c 代码或 python 检查 gnome 密钥环状态?
- docker - 无法在 Docker 映像中运行 Rust 应用程序:“作为 const fn 还不稳定”