稀疏自编码器(Sparse Autoencoder)图像特征提取 Matlab 实现
一、稀疏自编码器是什么?
目标:
用少量神经元表示高维图像,并强制大多数神经元“沉默”,只让少数激活 → 学到稀疏且具有语义的特征
与普通自编码器的区别
| 类型 | 目标 |
|---|---|
| 普通 AE | 重构误差最小 |
| 稀疏 AE | 重构误差 + 稀疏性约束 |
二、数学模型
1、 网络结构
x ∈ ℝⁿ → h ∈ ℝᵐ → x̂ ∈ ℝⁿ
- 输入:图像像素
- 隐藏层:稀疏编码
- 输出:重构图像
2、 代价函数
KL 散度(Sparsity Penalty)
- ρ:期望稀疏度(如 0.05)
- β:稀疏惩罚系数
三、Matlab 实现(手写数字 MNIST 示例)
1、 数据准备(图像 → 向量)
%% 加载图像数据(28×28)
load digit_images.mat % X: [n_samples × 784]
X = double(X);
X = X ./ max(X(:)); % 归一化
2、 稀疏自编码器参数
inputSize = 784; % 28×28
hiddenSize = 100; % 隐层神经元数
sparsityParam = 0.05; % 稀疏度 ρ
beta = 3; % 稀疏惩罚系数
lambda = 0.0001; % 权重衰减
maxIter = 400; % 迭代次数
3、 网络初始化
W1 = 0.1 * randn(hiddenSize, inputSize);
W2 = 0.1 * randn(inputSize, hiddenSize);
b1 = zeros(hiddenSize,1);
b2 = zeros(inputSize,1);
theta = [W1(:); W2(:); b1(:); b2(:)];
4、 代价函数(核心)
下面给出简化但可用的版本
function [cost, grad] = sparseAutoencoderCost(theta, ...
inputSize, hiddenSize, lambda, sparsityParam, beta, X)
m = size(X,1);
% 参数还原
W1 = reshape(theta(1:hiddenSize*inputSize), hiddenSize, inputSize);
W2 = reshape(theta(hiddenSize*inputSize+1:2*hiddenSize*inputSize), inputSize, hiddenSize);
b1 = theta(2*hiddenSize*inputSize+1:2*hiddenSize*inputSize+hiddenSize);
b2 = theta(end-inputSize+1:end);
% 前向传播
z2 = W1 * X' + repmat(b1,1,m);
a2 = sigmoid(z2);
z3 = W2 * a2 + repmat(b2,1,m);
a3 = sigmoid(z3);
% 重构误差
diff = a3 - X';
% 稀疏性
rho_hat = mean(a2,2);
KL = sparsityParam * log(sparsityParam ./ rho_hat) + ...
(1-sparsityParam) * log((1-sparsityParam) ./ (1-rho_hat));
% 代价函数
cost = 0.5/m * sum(diff(:).^2) + ...
lambda/2 * (sum(W1(:).^2) + sum(W2(:).^2)) + ...
beta * sum(KL);
% 反向传播(省略,可提供完整版)
grad = numericalGradient(@(t) sparseAutoencoderCost(...
t,inputSize,hiddenSize,lambda,sparsityParam,beta,X), theta);
end
5、 训练稀疏自编码器
options = optimset('MaxIter', maxIter, 'Display','iter');
theta = fmincg(@(t) sparseAutoencoderCost(t, ...
inputSize, hiddenSize, lambda, sparsityParam, beta, X), ...
theta, options);
6、 提取图像特征
% 还原参数
W1 = reshape(theta(1:hiddenSize*inputSize), hiddenSize, inputSize);
% 提取特征
features = sigmoid(W1 * X'); % [hiddenSize × n_samples]
features = features'; % [n_samples × hiddenSize]
features 就是稀疏编码特征
参考代码 稀疏自编码,用于自动提取输入图像特征 www.youwenfan.com/contentcnu/63488.html
四、特征可视化
figure;
for i = 1:25
subplot(5,5,i);
img = reshape(W1(i,:),28,28);
imagesc(img);
colormap gray; axis off;
end
title('稀疏自编码器学到的特征')
你会看到类似 Gabor 滤波器 / 边缘检测器
五、下游任务:SVM 分类
features = zscore(features);
labels = digit_labels;
svm = fitcsvm(features, labels, ...
'KernelFunction','linear');
pred = predict(svm, features);
acc = mean(pred == labels);
fprintf('Accuracy = %.2f%%\n', acc*100);
通常比原始像素高 5–15%
六、建议
| 建议 | 原因 |
|---|---|
| 输入归一化 | 自编码对尺度敏感 |
| 稀疏度 ρ ≤ 0.05 | 保证稀疏性 |
| 多层堆叠 | 形成深度特征 |
| GPU 加速 | 大规模图像 |
| 与 PCA 对比 | 验证非线性优势 |