使用keras,MLP,Landmarks和FER2013进行面部情感识别

时间:2018-07-24 14:54:47

标签: python-3.x tensorflow machine-learning keras

我对深度学习有点陌生,但是我正在尝试使用FER2013数据集和keras进行面部表情识别的项目。算法很简单:

1-读取FER2013图像集中的每个图像(大约30k张带有情感标签的图像48x48像素),并使用dlib提取其68个界标。 2-对于每个图像,使用坐标(xmean,ymean)计算界标定义的平面的质心。 3-对于图像中的每个地标,计算该地标的坐标与质心之间的欧式距离(一种标准化数据的方式); 4-创建一个数据集,其中每行是一个矢量,每个图像包含68个欧氏距离。

这个想法是创建一个不需要太多输入信息即可处理的学习模型,在这种情况下,我最终得到一个简单的68维向量,而不是(x,y)矩阵作为输入和输出的7维向量,其中每个位置代表不同的情感(p.ex [1,0,0,0,0,0,0]表示中立,[0,1,0,0,0,0,0 ]表示幸福,等等。有了这个输入,我相信一个MLP就足够了,而使用CNN则毫无意义。所以我这样绘制了我的神经网络:

model = Sequential()

model.add(Dense(68, activation='relu',use_bias=True, 
bias_initializer=RandomUniform(minval=0.01, maxval=0.02), input_dim=68))
model.add(Dropout(0.2))
model.add(Dense(340, use_bias=True, bias_initializer=RandomUniform(minval=0.01, maxval=0.02), activation='relu' ))
model.add(BatchNormalization())

model.add(Dense(7, activation='softmax'))
sgd = SGD(lr=0.00001, decay=0.0, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics ['categorical_accuracy'])

score = model.evaluate(training_input,tr_softmaxOut, verbose=0)

history=model.fit(training_input, tr_softmaxOut, validation_split=0.2, epochs=2500, batch_size=10)
score = model.evaluate(test_input, ts_softmaxOut, batch_size=13)

我已经做了几次尝试,改变学习率,衰减,改变批量大小,改变辍学率,并明显增加网络的深度和宽度。其中一些提供了明显的过度拟合,而其他一些实际上给出了欠拟合并且完全没有收敛,但是它们中的任何一个都没有给出大于49%的准确度。

有人可以告诉我我在做什么错吗?根据您的经验,是否可以做些什么来提高我的MLP的准确性? 另外,您认为CNN在我的情况下会更好吗? 抱歉,对于新手问题,这仍然是我要努力学习的领域。

预先感谢您的帮助。

0 个答案:

没有答案