对LeNet-5的matlab实现,识别MINST手写数字集

LeNet-5 是一个经典的卷积神经网络(CNN)架构,最初由 Yann LeCun 提出,用于手写数字识别任务,特别是针对 MNIST 数据集。在 MATLAB 中实现 LeNet-5 并用于识别 MNIST 数据集,可以通过 MATLAB 的深度学习工具箱(Deep Learning Toolbox)来完成。

实现 LeNet-5 的步骤和代码:

1. 准备 MNIST 数据集

MATLAB 提供了内置的 MNIST 数据集加载功能,可以直接使用。

matlab 复制代码
% 加载 MNIST 数据集
digitDatasetPath = fullfile(matlabroot, 'toolbox', 'nnet', 'nndemos', 'nndatasets', 'DigitDataset');
imds = imageDatastore(digitDatasetPath, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
[imdsTrain, imdsTest] = splitEachLabel(imds, 0.9, 'randomized');

2. 定义 LeNet-5 架构

LeNet-5 的架构包括多个卷积层、池化层和全连接层。以下是 MATLAB 中的实现:

matlab 复制代码
layers = [
    imageInputLayer([28 28 1], 'Name', 'input') % 输入层,图像大小为 28x28,灰度图像

    convolution2dLayer(5, 6, 'Padding', 'same', 'Name', 'conv_1') % 第一个卷积层
    batchNormalizationLayer('Name', 'BN_1') % 批量归一化层
    reluLayer('Name', 'relu_1') % ReLU 激活层
    maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_1') % 最大池化层

    convolution2dLayer(5, 16, 'Padding', 'same', 'Name', 'conv_2') % 第二个卷积层
    batchNormalizationLayer('Name', 'BN_2') % 批量归一化层
    reluLayer('Name', 'relu_2') % ReLU 激活层
    maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_2') % 最大池化层

    fullyConnectedLayer(120, 'Name', 'fc_1') % 全连接层
    reluLayer('Name', 'relu_fc_1') % ReLU 激活层
    fullyConnectedLayer(84, 'Name', 'fc_2') % 全连接层
    reluLayer('Name', 'relu_fc_2') % ReLU 激活层
    fullyConnectedLayer(10, 'Name', 'fc_3') % 输出层,10 个类别
    softmaxLayer('Name', 'softmax') % Softmax 层
    classificationLayer('Name', 'output') % 分类输出层
];

3. 配置训练选项

使用 trainingOptions 函数配置训练参数,例如学习率、迭代次数等。

matlab 复制代码
options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.01, ...
    'MaxEpochs',20, ...
    'MiniBatchSize', 128, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsTest, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress');

4. 训练模型

使用 trainNetwork 函数训练网络。

matlab 复制代码
net = trainNetwork(imdsTrain, layers, options);

5. 测试模型

使用测试集评估模型性能。

matlab 复制代码
YTest = classify(net, imdsTest);
accuracy = sum(YTest == imdsTest.Labels) / numel(imdsTest.Labels);
disp(['测试集准确率: ', num2str(accuracy * 100), '%']);

6. 可视化结果

可以随机选择一些测试图像,显示预测结果。

matlab 复制代码
figure;
for i = 1:10
    idx = randi(numel(imdsTest.Files));
    img = readimage(imdsTest, idx);
    label = classify(net, img);
    subplot(2, 5, i);
    imshow(img);
    title(char(label));
end

参考代码 对LeNet-5的matlab实现,识别MINST手写数字集 www.youwenfan.com/contentcsp/59637.html

完整代码

将以上代码片段组合起来,即可完成 LeNet-5 的实现和训练。

matlab 复制代码
% 加载数据集
digitDatasetPath = fullfile(matlabroot, 'toolbox', 'nnet', 'nndemos', 'nndatasets', 'DigitDataset');
imds = imageDatastore(digitDatasetPath, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
[imdsTrain, imdsTest] = splitEachLabel(imds, 0.9, 'randomized');

% 定义网络架构
layers = [
    imageInputLayer([28 28 1], 'Name', 'input')
    convolution2dLayer(5, 6, 'Padding', 'same', 'Name', 'conv_1')
    batchNormalizationLayer('Name', 'BN_1')
    reluLayer('Name', 'relu_1')
    maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_1')
    convolution2dLayer(5, 16, 'Padding', 'same', 'Name', 'conv_2')
    batchNormalizationLayer('Name', 'BN_2')
    reluLayer('Name', 'relu_2')
    maxPooling2dLayer(2, 'Stride', 2, 'Name', 'maxpool_2')
    fullyConnectedLayer(120, 'Name', 'fc_1')
    reluLayer('Name', 'relu_fc_1')
    fullyConnectedLayer(84, 'Name', 'fc_2')
    reluLayer('Name', 'relu_fc_2')
    fullyConnectedLayer(10, 'Name', 'fc_3')
    softmaxLayer('Name', 'softmax')
    classificationLayer('Name', 'output')
];

% 配置训练选项
options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.01, ...
    'MaxEpochs',20, ...
    'MiniBatchSize', 128, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsTest, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress');

% 训练网络
net = trainNetwork(imdsTrain, layers, options);

% 测试网络
YTest = classify(net, imdsTest);
accuracy = sum(YTest == imdsTest.Labels) / numel(imdsTest.Labels);
disp(['测试集准确率: ', num2str(accuracy * 100), '%']);

% 可视化结果
figure;
for i = 1:10
    idx = randi(numel(imdsTest.Files));
    img = readimage(imdsTest, idx);
    label = classify(net, img);
    subplot(2, 5, i);
    imshow(img);
    title(char(label));
end
相关推荐
AI科技星几秒前
数术工坊・八卷全书【本源创世终极版・万世定稿】
开发语言·网络·量子计算·拓扑学
雾沉川2 分钟前
Visual C++ 运行库合集 v105.0 部署与故障排查技术指南
开发语言·c++·dll
码云骑士4 分钟前
02-Python可变对象与不可变对象(上)-赋值陷阱与函数传参的暗坑
开发语言·python
gaohe26AIliuzeyu12 分钟前
Java内部类
java·开发语言
AI科技星15 分钟前
数术工坊・八卷全书(番外・实战升华副卷)【终极典藏定稿|完整无删减】
c语言·开发语言·网络·量子计算·agi
丘山望岳16 分钟前
剑起霜华——平衡二叉树(AVL树 )精讲
开发语言·数据结构·c++
yyuuuzz17 分钟前
云服务器软件部署的几个常见问题
运维·服务器·开发语言·网络·云计算·php·apache
z落落19 分钟前
Timer与DateTimePicker:控件使用全解析
开发语言·c#
Boom_Shu30 分钟前
浅拷贝与深拷贝
开发语言·c++·算法
2601_9618451536 分钟前
2026法考资料pdf|电子版|资料已整理
开发语言·前端框架·pdf·c#·xhtml·csrf·view design