1. DCGAN原理与Matlab实现概述
深度卷积生成对抗网络(DCGAN)是生成对抗网络(GAN)的一种改进架构,它通过引入卷积神经网络显著提升了图像生成质量。在Matlab中实现DCGAN需要2019b及以上版本,主要是因为新版提供了对深度学习更完善的支持,特别是dlnetwork、dlarray等面向自定义训练流程的工具。
GAN的核心思想是让两个神经网络相互对抗:生成器(Generator)负责从随机噪声生成逼真图像,判别器(Discriminator)则试图区分真实图像与生成图像。这种对抗过程最终会使生成器产生足以"欺骗"判别器的优质图像。DCGAN在此基础上做了三项关键改进:
- 使用步长卷积(Strided Convolution)替代池化层
- 在生成器和判别器中都使用批量归一化(Batch Normalization)
- 移除全连接层,完全基于卷积结构
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与数据加载
2.1 Matlab环境配置
首先确保已安装以下工具箱:
- Deep Learning Toolbox
- Parallel Computing Toolbox(可选,用于加速训练)
matlab复制% 检查工具箱是否安装
hasDL = license('test','neural_network_toolbox');
hasParallel = license('test','distrib_computing_toolbox');
assert(hasDL,'必须安装Deep Learning Toolbox');
2.2 数据准备与预处理
MNIST数据集包含60,000张28×28的手写数字灰度图像。Matlab内置了该数据集,但需要特别注意预处理步骤:
matlab复制digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos','nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath,...
'IncludeSubfolders',true,...
'LabelSource','foldernames');
% 数据增强配置(可选)
augmenter = imageDataAugmenter(...
'RandRotation',[-10 10],...
'RandXTranslation',[-3 3],...
'RandYTranslation',[-3 3]);
augmentedImds = augmentedImageDatastore([28 28],imds,...
'DataAugmentation',augmenter);
% 图像归一化到[-1,1]范围
preview = preview(augmentedImds);
preview = single(cat(4,preview{:}))/255*2-1;
注意:DCGAN对输入数据范围敏感,通常需要归一化到[-1,1]而非[0,1],这与tanh激活函数的输出范围匹配。
3. 网络架构设计
3.1 生成器网络
生成器采用转置卷积(Transposed Convolution)实现上采样,逐步将100维噪声向量转换为28×28图像:
matlab复制layersGenerator = [
imageInputLayer([1 1 100],'Name','noise','Normalization','none')
transposedConv2dLayer([7 7],512,'Name','tconv1')
batchNormalizationLayer('Name','bn1')
reluLayer('Name','relu1')
transposedConv2dLayer([3 3],256,'Stride',2,'Cropping','same','Name','tconv2')
batchNormalizationLayer('Name','bn2')
reluLayer('Name','relu2
