繁体   English   中英

Keras中的人脸分类CNN无法正确训练

[英]Face classification CNN in Keras does not train properly

我是机器学习的新手,这是我在StackOverflow上的第一篇文章。 我想训练一个CNN,以便它可以将我的脸与其他人区分开。 我的模型在前三个时期后才停止改善。

我在用于机器学习的在线数据库中找到了一些面孔,然后将其居中,进行灰度处理和裁剪。 我用网络摄像头从脸上拍摄的照片也做了同样的事情。

NN的数据如下所示:

| input                 | output    |       |
|---------------------- |--------   |---    |
| face of me            | 0         | 1     |
| face of someone else  | 1         | 0     |

到现在为止还挺好。

然后,我尝试使用以下结构来训练CNN:

model= Sequential()

# sort out the input layer later
model.add(Conv2D(32,3,3, activation='relu', input_shape=(100,100,3)))
model.add(MaxPooling2D((2,2)))

model.add(Conv2D(12,3,3, activation='relu'))
model.add(MaxPooling2D((2,2)))

model.add(Flatten())
model.add(Dense(600, activation='relu'))
model.add(Dense(60, activation='relu'))
#model.add(Dropout(p=0.2))
model.add(Dense(2, activation='softmax'))
model.summary()
epochs = 100
lrate = 0.01
decay = lrate/epochs
sgd = SGD(lr=lrate, momentum=0.9, decay=decay, nesterov=False)
#%%
model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy'])

我尝试了不同的优化器(sdg,adam,rmsprop),并对CNN的其他参数进行了一些尝试,但每次模型在前几个时期后都停止减少损失时,都会尝试。

Epoch 1/100
2176/2176 [==============================] - 55s 25ms/step - loss: 1.8043 - acc: 0.8869
Epoch 2/100
2176/2176 [==============================] - 56s 26ms/step - loss: 1.7037 - acc: 0.8943
Epoch 3/100
2176/2176 [==============================] - 57s 26ms/step - loss: 1.7037 - acc: 0.8943
Epoch 4/100

此示例在第2阶段之后的损耗没有改善。

您知道为什么会这样吗?

这里发生了不同的事情。

班级失衡

正如评论中已经讨论的那样,您的训练集包括2941个负样本(来自您以外的其他人的脸)和308个正样本(带有您的脸的图像)。 因此,始终对否决类投票的分类器将获得3249个样本中的2941个,即90.5%。 您应该牢记此信息来阅读您的训练准确性得分,因为您的89.4%暗示您的网络没有学到任何有价值的东西。

您可以尝试的方法:

  1. 对少数族裔过度采样
  2. 低估多数阶层
  3. 在损失函数中使用权重

关于此主题,存在大量文献和教程,因此,请四处看看。

模型容量/网络设计

您在评论中提到,使用平衡的训练数据后,损失仍然没有减少。 这表明您的模型容量不够高,或者该模型的设计不适合该任务。

根据任务的确切含义,存在许多不同的网络结构用于图像处理任务。 例如,对于做逐像素分类和实例分割(如网络掩码RCNN )看起来从是专门做脸部识别(如网络不同FaceNet )。 即使我们只专注于一项任务(在这种/您的情况下:面部识别),您发现的网络结构也会看起来非常不同。

那是什么意思呢? 为特定任务构建神经网络并非易事,而且很难预测哪种结构可以很好地完成任务。 为了找到合适的结构,经常需要反复试验。

模型容量描述了模型的“强大”能力。 对此没有严格的定义,但您可以这样考虑:解决不同的任务可能更难或更容易。 某个模型只能解决“足够容易”的问题,而在更困难的问题上,该模型只会表现出较差的性能。 模型的容量通常与网络设计/结构齐头并进。

这对您有什么帮助? 好吧,请看一下完成与您要完成的任务相同的不同网络结构,并了解为什么使用某些构建基块以及它们的用途。 然后,您可以尝试重建此结构并进行试验。 一个不错的起点可能是这个这个关于面部识别的教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM