我该如何修复我的 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?
提供的解决方案
我目前正在尝试使用 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?
提供的解决方案