稀疏自编码器图像特征提取 Matlab 实现

稀疏自编码器(Sparse Autoencoder)图像特征提取 Matlab 实现


一、稀疏自编码器是什么?

目标

用少量神经元表示高维图像,并强制大多数神经元“沉默”,只让少数激活 → 学到稀疏且具有语义的特征

与普通自编码器的区别

类型 目标
普通 AE 重构误差最小
稀疏 AE 重构误差 + 稀疏性约束

二、数学模型

1、 网络结构

x ∈ ℝⁿ → h ∈ ℝᵐ → x̂ ∈ ℝⁿ

2、 代价函数

KL 散度(Sparsity Penalty)


三、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 对比 验证非线性优势

 

专注于matlab/simulink,电子电路,编程