Python 检查输入时出错:预期输入_1有4个维度,但得到了具有形状的数组(2242243)

Python 检查输入时出错:预期输入_1有4个维度,但得到了具有形状的数组(2242243),python,tensorflow,keras,deep-learning,conv-neural-network,Python,Tensorflow,Keras,Deep Learning,Conv Neural Network,我正试图用我自己的数据训练一个CNN来解决二元分类问题。但我对输入的预期大小有一个问题,我认为是(224,3)。我搜索了这个案例,发现有人说可以通过将图像大小从(224224,3)调整到(1224224,3)来修复,但没有效果 这是我的密码: 导入scipy.io 导入tensorflow作为tf 进口cv2 #参数 img_高度=224 img_宽度=224 img_深度=3 类别=2 #加载数据 db_name='polo' db_path='D:/databases/'+db_name+'

我正试图用我自己的数据训练一个CNN来解决二元分类问题。但我对输入的预期大小有一个问题,我认为是(224,3)。我搜索了这个案例,发现有人说可以通过将图像大小从(224224,3)调整到(1224224,3)来修复,但没有效果

这是我的密码:

导入scipy.io
导入tensorflow作为tf
进口cv2
#参数
img_高度=224
img_宽度=224
img_深度=3
类别=2
#加载数据
db_name='polo'
db_path='D:/databases/'+db_name+'/'
db_data=scipy.io.loadmat(db_路径+db_py.mat)
db_size=len(db_数据['db']['images'][0][0])
faces_path='data/'+db_name+'/faces/'
图像=[]
标签=[0]*db\u大小
对于范围内的i(0,db_大小):
filename='data/'+db_name+'/faces/'+db_data['db']['images'][0][0][i][2][0]
image=cv2.imread(文件名)
图像=cv2。调整大小(图像,(图像高度,图像宽度))
images.append(图像)
标签[i]=db_数据['db']['subjects'][0][0][i][4][0][0][0][0]
输入=tf.keras.layers.Input(形状=(img_高度、img_宽度、img_深度))
layers=tf.keras.layers.Conv2D(32,(3,3),padding=“same”)(输入)
层=tf.keras.layers.Activation(“relu”)(层)
层=tf.keras.layers.BatchNormalization(轴=-1)(层)
layers=tf.keras.layers.Conv2D(32,(3,3),padding=“same”)(层)
层=tf.keras.layers.Activation(“relu”)(层)
层=tf.keras.layers.BatchNormalization(轴=-1)(层)
layers=tf.keras.layers.MaxPoolig2D(池大小=(2,2))(层)
层=tf.keras.layers.Dropout(0.25)(层)
layers=tf.keras.layers.Conv2D(64,(3,3),padding=“same”)(层)
层=tf.keras.layers.Activation(“relu”)(层)
层=tf.keras.layers.BatchNormalization(轴=-1)(层)
layers=tf.keras.layers.Conv2D(64,(3,3),padding=“same”)(层)
层=tf.keras.layers.Activation(“relu”)(层)
层=tf.keras.layers.BatchNormalization(轴=-1)(层)
layers=tf.keras.layers.MaxPoolig2D(池大小=(2,2))(层)
层=tf.keras.layers.Dropout(0.25)(层)
layers=tf.keras.layers.flatte()(层)
层=tf.keras.layers.Dense(512)(层)
层=tf.keras.layers.Activation(“relu”)(层)
layers=tf.keras.layers.BatchNormalization()(层)
层=tf.keras.layers.Dropout(0.5)(层)
层=tf.keras.layers.Dense(类)(层)
图层=tf.keras.layers.Activation(“softmax”)(图层)
InitialLearnRate=0.03
MaxEpochs=30
MiniBatchSize=32
opt=tf.keras.optimizers.SGD(lr=InitialLearnRate,detaction=InitialLearnRate/MaxEpochs)
model=tf.keras.model(输入,层,name=“net”)
compile(loss=“categorical\u crossentropy”,optimizer=opt,
指标=[“准确度”])
model.summary()
H=模型拟合(图像、标签、,
批次大小=最小批次大小,历元数=最大历元数,详细数=1,每历元数的步骤数=10)
如果你去官方网站搜索conv2d输入形状,你会看到:

带形状的4D张量:(批次、通道、行、列)如果数据_格式为“通道_优先”或 带形状的4D张量:(批次、行、列、通道)如果数据\格式为“通道\最后一个”

或者,下面是有关输入格式的详细信息

如果您有多个图像,那么在您的案例中,您将有一个大小为
(batch_size,244244,3)
的输入。我看到你做的是创建一个包含所有这些图像的列表。我会尝试:

images=np.empty(批量大小,244,244,3)
对于范围内的i(0,db_大小):
文件名=('data/'
+数据库名称
+“/faces/”
+db_数据['db']['images'][0][0][0][i][2][0])
image=cv2.imread(文件名)
图像[i]=cv2.调整大小(图像,(img_高度,img_宽度))

如果这没有帮助,您收到的错误消息可能会帮助其他人回答您的问题。

是的,您必须将其改为(1224224,3),并告诉我们为什么它不起作用。我没有看到您在代码中这样做。他可以通过添加
images=np.array(images)
来修复错误,然后再将其输入模型进行训练。但事实上,这个错误是由输入一个列表而不是一个numpy数组引起的。我按照你说的做了:images=np.empty((db\u大小,img\u高度,img\u宽度,img\u深度))和images[I]=image bt我得到了这个新错误:ValueError:检查模型时出错目标:传递给模型的Numpy数组列表不是模型预期的大小。预计会看到1个数组,但得到了以下1000个数组的列表:[5,8,10,14,16,18,19,22,28,29,33,40,43,43,2,3,4,5,7,12,15,16,18,20,21,23,26,29,31,36,38,18,20,23,25,35,38,47,49,51,58,60,61,19,21,26,28,30,40,48,51。。。