面部分类Keras中的CNN无法正常训练

时间:2018-06-03 10:39:19

标签: python tensorflow keras face-recognition convolutional-neural-network

我是机器学习的新手,这是我在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之后的损失没有改善。

你知道为什么会出现这种情况吗?

1 个答案:

答案 0 :(得分:0)

这里有不同的事情。

班级不平衡

正如评论中已经讨论过的,您的训练集包含2941个阴性样本(来自其他人的面部)和308个阳性样本(带有脸部的图像)。因此,总是为负面类别投票的分类器得到3249个样本中的2941个,即90.5%。 您应该记住这些信息,因为您的89.4%暗示您的网络没有学到任何有价值的东西。

你可以试试:

  1. 过度采样少数群体
  2. 取消对多数班级的取样
  3. 在损失函数中使用权重
  4. 关于这个主题存在大量的文献和教程,所以请稍微看一下。

    模型容量/网络设计

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

    图像处理任务存在许多不同的网络结构,具体取决于任务的确切内容。例如,用于进行像素分类和实例分割的网络(如Mask RCNN)与用于进行人脸识别的网络(如FaceNet)看起来不同。即使我们只关注一项任务(在这个/你的情况下:人脸识别),你发现的网络结构看起来会有很大不同。

    那是什么意思?为特定任务构建神经网络并非易事,并且要预测哪些结构适合哪项任务并不容易。为了找到合适的结构,经常需要进行大量的反复试验。

    模型容量描述了模型的“强大”程度。对此没有严格的定义,但您可以这样思考:不同的任务可能更难或更容易解决。某个模型只能解决“足够容易”的问题,而对于更困难的问题,模型只能表现出较差的性能。模型容量通常与网络设计/结构密切相关。

    这对你有什么帮助?好吧,看看执行相同任务的不同网络结构,并了解为什么使用某些构建块以及它们有什么用处。然后,您可以尝试重建此结构并进行实验。一个好的起点可能是thisthis人脸识别教程。