对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
相关推荐
无限的鲜花7 小时前
反射(原创推荐)
java·开发语言
yongche_shi8 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he8 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
AI行业学习9 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
大圣编程10 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
upgrador10 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++
yoothey11 小时前
报废审批流规则引擎设计——责任链模式完整实现
linux·开发语言·bash
geovindu11 小时前
python: Functional Options Pattern
开发语言·后端·python·设计模式·惯用法模式·函数式选项模式
wuyk55511 小时前
24. C 语言模块化:不是拆几个.c 文件那么简单
c语言·开发语言·stm32·单片机
凯瑟琳.奥古斯特12 小时前
K次取反最大化数组和解法(力扣1005)
开发语言·c++·算法·leetcode·职场和发展