我该如何修复我的 CNN?我陷入了一个错误循环,我知道我错误地实施了 CNN?

How can i repair my CNN? I am stuck in a circle of errors and i know that i implemented the CNN wrong?

我目前正在尝试使用 python 中的 tensorflow.keras 构建我的人脸检测 CNN。它应该拍摄两种类型的图像:面部和非面部。 我尝试实现的模型来自 table [Cnn][1],但我不断收到错误,即使我修复了一个,我也会得到另一个,我陷入了错误循环。 [1]: https://i.stack.imgur.com/WJCPb.png 请告诉我如何修复它?

testRatio = 0.2
valRatio = 0.2
path="D:\ObjectsRecognition\data"
folder=["face","nonface"]
class_names = ["Face","Nonface"]
predictionList = []


def label(numpy):
    npList=np.array([])
    for i in range(len(numpy)):
        if numpy[i]=="face":
            npList=np.append(npList,[0])
        else:
            npList=np.append(npList,[1])
    return npList

def file():

    ############################

    images = []  # LIST CONTAINING ALL THE IMAGES
    classNo = []  # LIST CONTAINING ALL THE CORRESPONDING CLASS ID OF IMAGES
    myList = os.listdir(path)
    print("Total Classes Detected:", len(myList))
    noOfClasses = len(myList)
    print("Importing Classes .......")
    for x in folder:
        myPicList = os.listdir(path + "/" + x)
        for y in myPicList:
            curImg = cv.imread(path + "/" + x + "/" + y)
            curImg = cv.resize(curImg, (231, 231))
            images.append(curImg)
            classNo.append(x)

        print(x, end=" ")

    print(" ")

    print("Total Images in Images List = ", len(images))
    print("Total IDS in classNo List= ", len(classNo))
    #######################
    #### CONVERT TO NUMPY ARRAY
    images = np.array(images)
    classNo = np.array(classNo)


    #### SPLITTING THE DATA
    X_train, X_test, y_train, y_test = train_test_split(images, classNo, test_size=testRatio)
    print(len(X_train) )
    print(len(X_test) )
    print(len(y_train) )
    print(len(y_test) )

    ####################
    (training_images, training_labels), (testing_images, testing_labels) = (X_train,label(y_train)), (X_test,label(y_test))
    training_images, testing_images = training_images/255, testing_images/255
    return (training_images, training_labels), (testing_images, testing_labels)



def defineTrainModel():
    model = models.Sequential()

    model.add(layers.Conv2D(96, (11, 11),strides=(4,4) ,activation='relu', input_shape=(231, 231, 3)))
    model.add(layers.MaxPooling2D((2, 2),strides=(2,2)))

    model.add(layers.Conv2D(256, (5, 5),strides=(1,1), activation='relu',input_shape=(24, 24, 3)))
    model.add(layers.MaxPooling2D((2, 2),strides=(2,2)))

    model.add(layers.Conv2D(512, (3, 3), strides=(1,1) ,activation='relu',input_shape=(12, 12, 3)))
    model.add(layers.ZeroPadding2D(padding=(1,1)))


    model.add(layers.Conv2D(1024, (3, 3), strides=(1, 1), activation='relu', input_shape=(12, 12, 3)))
    model.add(layers.ZeroPadding2D(padding=(1,1)))


    model.add(layers.Conv2D(1024, (3, 3), strides=(1, 1), activation='relu', input_shape=(24, 24, 3)))
    model.add(layers.MaxPooling2D((2, 2), strides=(2, 2)))
    model.add(layers.ZeroPadding2D(padding=(1,1)))
    model.add(layers.Flatten())

    model.add(layers.Dense(3072, activation='relu',input_shape=(6,6,3)))
    model.add(layers.Dense(4096, activation='relu',input_shape=(1,1,3)))
    model.add(layers.Dense(2, activation='softmax',input_shape=(1,1,3)))


    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    model.summary()
    model.fit(training_images, training_labels, epochs=30, validation_data=(testing_images, testing_labels))

    loss, accuracy = model.evaluate(testing_images, testing_labels)
    print(f"Loss: {loss}")
    print(f"Accuracy: {accuracy}")

    model.save("FancyGPUTrainedModel.h5")

(training_images, training_labels), (testing_images, testing_labels)= file()   #Spliting the data
defineTrainModel()

这是我遇到的错误,但如果我尝试修复它,我会得到另一个错误: ValueError:层 zero_padding2d 的输入 0 与层不兼容:预期 ndim=4,发现 ndim=2。已收到完整形状:(None, 51200)

这是模型摘要: 型号:“顺序”


图层(类型)输出形状参数#

conv2d (Conv2D) (None, 59, 59, 96) 34944


max_pooling2d (MaxPooling2D) (None, 29, 29, 96) 0


conv2d_1 (Conv2D) (None, 25, 25, 256) 614656


max_pooling2d_1 (MaxPooling2 (None, 12, 12, 256) 0


conv2d_2 (Conv2D) (None, 10, 10, 512) 1180160


zero_padding2d (ZeroPadding2 (None, 12, 12, 512) 0


conv2d_3 (Conv2D) (None, 10, 10, 1024) 4719616


zero_padding2d_1 (ZeroPaddin (None, 12, 12, 1024) 0


conv2d_4 (Conv2D) (None, 10, 10, 1024) 9438208


max_pooling2d_2 (MaxPooling2 (None, 5, 5, 1024) 0


zero_padding2d_2 (ZeroPaddin (None, 7, 7, 1024) 0


密集 (Dense) (None, 7, 7, 3072) 3148800


dense_1 (密集) (None, 7, 7, 4096) 12587008


dense_2 (密集) (None, 7, 7, 2) 8194

总参数:31,731,586 可训练参数:31,731,586 不可训练的参数:0


还有 训练标签:shape (6607,)

测试标签:形状:(1652,)

训练图像:形状 (6607, 245, 245, 3)

测试图像:形状:(1652, 245, 245, 3)

tensorflow.python.framework.errors_impl.InvalidArgumentError: logits and labels must have the same first dimension, got logits shape [1568,2] and labels shape [32]

上述错误可以通过在最后一个零填充后添加一个 layer.Flatten() 来解决,因为当前输出是 (None, 7, 7, 2) 形状,它应该是 (None, 2) 因为最后你想要 类 的概率,在这种情况下是 2.

tensorflow.python.framework.errors_impl.NotFoundError: No algorithm worked!

参考Oktay Alizada in the question: How to solve "No Algorithm Worked" Keras Error?

提供的解决方案