Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 人脸表情识别的学习曲线分析_Python_Tensorflow_Machine Learning_Keras - Fatal编程技术网

Python 人脸表情识别的学习曲线分析

Python 人脸表情识别的学习曲线分析,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我在tensorflow(python)中建立了一个神经网络,它在fer2013数据集上运行(可以在kaggle上找到)。我的网络架构是这样的 emotion_model = Sequential() emotion_model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48,48,1))) emotion_model.add(Conv2D(64, kernel_size=(3, 3), activati

我在tensorflow(python)中建立了一个神经网络,它在fer2013数据集上运行(可以在kaggle上找到)。我的网络架构是这样的

emotion_model = Sequential()
emotion_model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(48,48,1)))
emotion_model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
emotion_model.add(Dropout(0.25))
emotion_model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
emotion_model.add(Conv2D(128, kernel_size=(3, 3), activation='relu'))
emotion_model.add(MaxPooling2D(pool_size=(2, 2)))
emotion_model.add(Dropout(0.25))
emotion_model.add(Flatten())
emotion_model.add(Dense(1024, activation='relu'))
emotion_model.add(Dropout(0.5))
emotion_model.add(Dense(7, activation='softmax'))

emotion_model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.0001, decay=1e-6), metrics=['accuracy'])
emotion_model_info = emotion_model.fit(
        train_generator,
        steps_per_epoch=28709 // 64,
        epochs=50,
        validation_data=validation_generator,
        validation_steps=7178 // 64)
我为这个算法绘制了一条学习曲线,得到了:


现在,我是机器学习的初学者,但测试和验证数据准确性/成本的差异似乎表明数据拟合过度。然而,我观察了其他人在同一数据集上的准确度水平,发现大多数人在验证时的准确度在62%左右(这是我目前的情况),而他们在训练时的准确度通常大致相同。所以我很惊讶,我的训练数据表现得很好(指示过拟合),但是我的验证精度与其他实现一致。我的问题有两个方面。首先,我的实现是否有任何错误,可能导致我的模型在训练中表现得如此出色,但在val上表现得很平均(实际上没有任何改进的余地),或者这只是典型的过度拟合?如果它是过度适合,我将感谢一些建议,如何应对这一点。我的数据集在很大程度上是固定的(我想如果需要的话,我可以尝试添加更多的数据),我尝试添加一些正则化,这损害了性能。基本上,我觉得我错过了一些东西。我怀疑我的训练准确率如此之高,我想在我花时间纠正过度装配之前检查一下,以确保我没有遗漏任何东西。非常感谢您的帮助。

您说得很对:这正是过度装修的定义

  • 验证和培训损失分歧
  • 验证和培训精度存在差异
  • 验证损失随后增加
一般来说,我们也期望验证损失将在大约相同的点达到相对最小值——这定义了收敛点。在这里,似乎模型在训练中学习到的许多东西中,在第8纪元前后的分歧点之后仍然有一些有用的学习

下一个要考虑的事项是

  • 是什么让你认为你需要训练50个时代?第八纪元是停止训练的合理场所吗
  • 您是否检查了您的数据集,以确保培训集确实正确地代表了整个数据集
  • 考虑交叉验证以检查数据拆分的可行性

我对这个特定的数据集不太了解,但一般来说,深度学习模型总是会收敛到最适合训练数据的程度,因为它足够强大(有足够的神经元)

您可以始终在主层之间使用下拉层,主层是在输入到传入层中的部分像素中随机弹出的层。只要做:

emotion_model.add(tensorflow.keras.layers.Dropout(dropout_precentage))
您还可以尝试使用L1和/或L2范数,这只是将一层的权重相加到最终损失,这意味着模型不能为某个特征赋予较大的权重,这会减少装备。只需向包含权重的层添加一个kernel_正则化器参数,如:

emotion_model.add(Conv2D(64, kernel_size=(3, 3), activation='relu',
    kernel_regularizer = keras.regularizers.l1() ))

我想让我感到困惑的是,尽管算法过度拟合了训练数据,但验证数据的性能并没有下降,只是大致保持不变。当验证数据与训练数据相匹配时,性能是否会变得越来越差?是的——在我回答的过程中,我发出了奇怪的不断提高的验证精度。如果没有完整的示例,我们无法分析您的精度曲线。我已经尝试将内核正则化器添加到我的所有层中,它实际上似乎会降低验证精度,这很奇怪,可能此数据集不够大,无法对模型进行概括。你试过数据扩充吗?我没试过数据扩充,不过这可能是个好主意。我只是想先确定这是值得的。考虑到代码,你可能做到了,你总是可以给图像生成器添加更多的随机性。如果所有这些都失败了,我建议尝试迁移学习方法。如果你以前没有尝试过的话,它将是既简单又有趣的。哦,关于内核调节器的事情。调节器乘以的比例也是一个重要因素,如果指定任意值,可能最终破坏模型的行为。