前言
本实验记录作者在学习周志华老师的《机器学习》过程中所做的实验
实验所用APP为WEKA,使用教程可见WEKA使用教程(经典教程转载)-优快云博客
实验一:人脸识别
一、实验过程:
- 首先下载原始数据并加入自己的照片,同时按照要求命名
- 提取照片信息并整理到一张excel表格中
源代码:(使用时把路径和文件夹进行替换即可,功能是将32x30大小的图片转换为960x1)
from PIL import Image
import numpy as np
import os
import openpyxl
workbook = openpyxl.load_workbook("D:/桌面/faces_data.xlsx")
sheet = workbook.active
# 定义输入文件夹和输出文件夹路径
input_folder = "D:/桌面/faces_4"
for check_folder in os.listdir(input_folder):
for filename in os.listdir(input_folder + '/' + check_folder):
# 读取照片并调整大小
input_path = os.path.join(input_folder + '/' + check_folder, filename)
image = Image.open(input_path) # 替换为您的照片路径
image = image.resize((32, 30))
# 提取原始数据并重新排列
raw_data = []
pixels = image.load()
for y in range(image.height):
for x in range(image.width):
# 提取每个像素的原始数据
if image.mode == 'RGB':
r, g, b = pixels[x, y]
raw_data.append(int(r * 0.30 + g * 0.59 + b * 0.11)
elif image.mode == 'L':
gray = pixels[x, y]
raw_data.append(gray)
filename1 = filename
split_parts = filename1.split("_")
raw_data.append(split_parts[0])
raw_data.append(split_parts[1])
#将列表中的数据存入 Excel 的一行
sheet.append(raw_data)
workbook.save("D:/桌面/faces_data.xlsx")
照片数据内容:
这里发现本人照片的各项数据值均比其他照片的数据值大,分析认为是我的照片是彩色的,而原始数据的照片大多为单一的黑色、灰色、白色,从而导致在计算像素的rgb_value以及像素的灰度值Gray时,本人照片的数据值偏大
于是检索RGB如何转为灰度值,得到公式grey=r * 0.30 + g * 0.59 + b * 0.11,求得灰度值转为int类型,存在raw_data数组中,源代码中使用的是最新版本,图片数据也是。
二、实验结论
1.人脸识别(pose不作为输入属性,即移除pose)
准确度:
插入sjw前与插入sjw后,准确度的差别并不是很明显。
用时:
上图中,BP神经网络和逻辑回归用时较少的原因是PCA(主成分分析)预处理过的,将960维降维至68。在未对数据进行降维处理之前,BP神经网络对数据的处理时间需要2221.47s。降维结果如下图:
虽然加入和不加入sjw的时间并没有很大的可比性,但是通过两种结果大概可以确定各个模型对于同一组数据的处理速度的快慢,大致为:朴素贝叶斯 < 贝叶斯网络、C4.5决策树 < 支持向量机 < 逻辑回归 < BP神经网络
2.姿势识别(userid不作为输入属性,即移除userid)
准确度:
用时:
PCA将维度降至67,使BP神经网络对于数据2371.69s的处理时间降至10s以内。
3.隐藏节点数量对结果的影响:
整体客观分析:
BP神经网络的隐藏层节点数对BP神经网络预测精度的影响:节点数太少,网络不能很好地学习,网络不能具有必要的学习能力和信息处理能力,准确度会受影响;节点数量越多,神经网络越能够学习和表示复杂的非线性关系;但是节点数太多,不但训练时间会增加,而且网络容易过拟合。
对userid的影响(pose不作为输入属性,即移除pose):
隐藏节点对于userid准确度的影响:
当隐藏节点数量为0时,是输入层对输出层的直接映射,然而模型对于userid识别的准确度很高,说明这种映射是极为成功的,也从侧面反映数据集本身可能是线性集。
当隐藏层节点从1->5逐渐增多,准确率也逐步增高,说明隐藏节点数量的增加,增加了神经网络的复杂性,使得网络能够更好地拟合训练数据中的复杂模式和关系。更多的隐藏层节点提供了更多的非线性变换和特征组合的可能性,使网络能够更好地捕捉输入数据中的细微变化。同时提高特征提取能力。
当隐藏节点数量为a、i、o、t时,准确率基本一致,暂时推断出以下可能原因:
- 数据集较小,由于数据集较小,使得这些数量的隐藏节点都能较为准确且轻松的拟合数据,但是数据集较小也带来了过拟合的问题,即在未训练过的数据上的表现较差
- 神经网络对于数据特征的提取能力已达上限,故增加节点数量也不会有太大的准确度上面的提升
对pose准确度的影响(userid不作为输入属性,即移除userid):
相较曲线的走势,与上图对userid的识别准确度相似,但是在隐藏节点数量为1时,准确度相较uesrid较高,说明该组数据不同属性之间的区别度较userid组可能更大,能够使得即使只有一个隐藏层节点,也可以解决一部分的问题。
- 学习速率对结果的影响:
如果你把学习率设置太低,训练会进展的很慢:因为你在网络的权重上只做了很少的调整。然而,如果你的学习率被设置的太高,它可能在你的损失函数上带来不理想的后果。
学习速率对userid准确度的影响:
学习速率对pose准确度的影响:
两个图表的折线走势相似,一起分析:
学习速率为0.001:导致参数更新的步长较小,收敛速度慢,导致模型停滞在较差的准确度上或者长时间陷入局部最优解无法出来,使得准确度不高。
学习速率为0.01、0.1、0.3、0.5、0.7、1.0时:模型的准确度也较之前有了提高,即向着最优解的方向靠近,但可能有的学习速率已经超过了最优解,使得结果在最优解的附近摇摆。
如果学习速率过大的话,由于参数的更新步长增大,模型也有可能无法收敛到最优解,使得训练准确度下降。
三、高级任务
1、把姿势识别结果作为人脸识别器的输入,对最终结果有何影响,讨论领域知识的作用
(1)在PCA处理时,不将pose属性移除,而将其与其余960条属性一同降维
降维结果
(2)然后用响应的模型训练,得到userid的识别准确率结果如下:
结果分析:
pose作为人脸识别的输入与不做为人脸识别的输入,对于模型的准确度的影响很小,推测有以下可能:
①pose属性和userid属性存在较弱的相关性,即两个属性在统计上可能没有明显的关联。从而使得pose属性的存在或缺失不会对userid的判断属性结果产生很大影响
②数据集中,pose属性的取值分布较为均匀,即不同取值的样本数相对平衡,使得pose属性的存在或缺失对userid的影响较小
③在userid准确性的训练中,可能pose属性在整个网络中的权重比较小,或者在网络的隐藏层中被较少的神经元所利用。
领域知识的作用
在该模型中,领域知识可以在数据集的预处理方面起到作用,如果我们在训练之前就已经知道pose对于人脸识别的影响很小,就可以将pose这个属性移除之后再进行训练,既避免了冗余数据对于训练结果的影响,又减少了训练成本;此外,领域知识还可以在具体的问题的解决上起到作用,比如我们可以选择更适合人脸识别的模型进行训练,以及进行一些参数的调整,使得最终的识别效果达到最优;最后,领域知识可以提供对相关变量和因素的理解,从而帮助构建更准确和可靠的预测模型。