本文作者是Yu欸,目前在华中科技大学攻读博士学位,定期记录并分享所学知识,博客关注者5w+。
主成分分析(PCA,Principal Component Analysis)是一项在高维数据中,寻找最重要特征的降维技术,大大减少数据的维度,而不显著损失信息量。本文将通过基于飞桨框架的实际代码示例,来展示所提供的高效、灵活的线性代数API,如何简化机器学习和深度学习中的数据处理和分析工作,为高维数据集的处理和分析提供了有效工具。主成分分析在人脸识别项目中完整代码及数据集已上传至飞桨星河社区:
https://aistudio.baidu.com/projectdetail/8055072
在现代计算框架中,为了高效地处理和存储大规模的数据集,尤其是在这些数据集中存在大量零值的情况下,采用稀疏数据结构变得尤为重要。飞桨是一个领先的深度学习平台,提供了强大的稀疏计算能力,支持从基本的稀疏张量操作到构建复杂的稀疏神经网络。这些工具主要通过 paddle.sparse 命名空间来实现,使得开发者能够高效处理大量包含零值的数据集,从而优化内存使用和计算速度。
数据集
本文使用的是ORL官方数据集,下载网址:
http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.tar.Z
该数据集包含40个人的人脸图像,其中每一个人有10张人脸图像。相应的PGM文件为说明。
安装库
安装cv2的库:
pip install opencv-python
安装飞桨框架的库:(cpu版本的即可)
pip install paddle
基于飞桨框架实现代码和相关函数
- 图片矢量化
在进行主成分分析之前,我们需要将所有训练图片矢量化为向量。首先定义一个函数,将人脸图像矢量化为一个向量,向量大小与图片的像素有关。
import cv2
import paddle
# 图片矢量化
def img2vector(image):
img = cv2.imread(image, 0) # 读取图片
imgVector = paddle.reshape(paddle.to_tensor(img, dtype='float32'), [1, -1]) # 重塑为1行多列
return imgVector
- 读取数据并进行矢量化
接下来定义一个函数用于读取训练图片,并对每张图片进行矢量化处理:
import os
import numpy as np
class ORLDataset:
def __init__(self, data_path, k, train=True):
self.data_path = data_path
self.k = k
self.train = train
def load_orl(self):
train_images = []
train_labels = []
test_images = []
test_labels = []
sample = np.random.permutation(10) + 1 # 生成随机序列
for i in range(40): # 共有40个人
people_num = i + 1
for j in range(10): # 每人10张照片
image_path = os.path.join(self.data_path, 's' + str(people_num), str(sample[j]) + '.pgm')
img = img2vector(image_path) # 读取图片并进行矢量化
if j < self.k: # 构成训练集
train_images.append(img)
train_labels.append(people_num)
else: # 构成测试集
test_images.append(img)
test_labels.append(people_num)
if self.train:
return paddle.concat(train_images, axis=0), paddle.to_tensor(train_labels, dtype='int64')
else

最低0.47元/天 解锁文章
1833

被折叠的 条评论
为什么被折叠?



