所以我在尝试使用Tensorflow和CNN类型来创建一个面部识别系统,我只为我的数据提供了15张我的面部图片(这是一个简单的项目),我希望它能预测这是否是我的面部,像是真或假,问题是我不明白我的代码中哪里出了错误。这就是
ValueError: logits and labels must have the same shape ((None, 2) vs (None, 1))
这是我的代码
# Face ID project, using CNN tensorflowfrom tensorflow.keras.preprocessing.image import img_to_arrayfrom tensorflow.keras.optimizers import Adam from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D, BatchNormalization, Activationfrom tensorflow.keras import backend as Kimport numpy as npimport cv2 import glob# Preparing the data and parametersepochs = 10lr = 1e-3batch_size = 64 img_dims = (96,96,3)data = []labels = []image_files = glob.glob("C:/Users/berna/Desktop/Programming/AI_ML_DL/Projects/FaceID/Data/*")for img in image_files: image = cv2.imread(img) image = cv2.resize(image, (img_dims[0], img_dims[1])) image = img_to_array(image) data.append(image) if img == img: label = 1 else: label = 0 labels.append([label]) # Preproccesing the data (convert arrays)data = np.array(data, dtype="float32") / 255.0labels = np.array(labels)X = data y = labelsdef build(width, height, depth, classes): model = Sequential() inputShape = height, width, depth chanDim = -1 if K.image_data_format() == "channels_first": inputShape = depth, height, width chanDim = 1 # Creating the model model.add(Conv2D(32, (3,3), padding="same", input_shape=inputShape)) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(MaxPooling2D(pool_size=(3,3))) model.add(Dropout(0.25)) model.add(Conv2D(64, (3,3), padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(Conv2D(64, (3,3), padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Conv2D(128, (3,3), padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(Conv2D(128, (3,3), padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(axis=chanDim)) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(1024)) model.add(Activation("relu")) model.add(BatchNormalization()) model.add(Dropout(0.5)) model.add(Dense(classes)) model.add(Activation("sigmoid")) return model# Build the model call model = build(width=img_dims[0], height=img_dims[1], depth=img_dims[2], classes=2)# compile the modelopt = Adam(lr=lr, decay=lr/epochs)model.compile(loss="binary_crossentropy", optimizer=opt, metrics=['accuracy'])# fitting the modelH = model.fit(X, y, batch_size=batch_size, epochs=epochs, verbose=1)model.save('faceid.model')
回答:
正如@Frightera所说,更换:
model.add(Dense(classes))
为 model.add(Dense(1))
应该可以解决问题。
你的标签是一个整数,但你的最后一层输出的是一个二维数组。