神经网络实验6 手写字识别(matlab)

下载MNIST数据集

从博主绑定的资源中下载以下文件
在这里插入图片描述
编写代码时要根据你的数据文件路径修改代码哦!!!

一、 实验目的和要求

利用cnn神经网络实现手写字识别

二、 实验环境

matlab

三、 实验内容

利用cnn神经网络实现手写字识别

四、 实验步骤

1. 数据预处理

mnist_uint8.mat 包含了 MNIST 数据集的全部数据,其中:

train_x: 60000*784 矩阵,60000 个训练样本,每个训练样本像素值展开成了行向量。

train_y: 60000*10 矩阵,60000 个训练样本标签,每个样本标签中对应分类元素值为 1,其余为 0;

test_x: 10000*784 矩阵,10000 个测试样本,每个训练样本像素值展开成了行向量。

test_y: 10000*10 矩阵,10000 个测试样本标签,每个样本标签中对应分类元素值为 1,其余为 0;

clc; clear; close all;

% 文件路径 (请根据您的数据文件路径修改)
trainImageFile = 'C:/Users/Public/TongYuan/.julia/dev/flux/train-images.idx3-ubyte';
trainLabelFile = 'C:/Users/Public/TongYuan/.julia/dev/flux/train-labels.idx1-ubyte';
testImageFile = 'C:/Users/Public/TongYuan/.julia/dev/flux/t10k-images.idx3-ubyte';
testLabelFile = 'C:/Users/Public/TongYuan/.julia/dev/flux/t10k-labels.idx1-ubyte';

% 加载数据
[train_x, train_y] = loadMNIST(trainImageFile, trainLabelFile);
[test_x, test_y] = loadMNIST(testImageFile, testLabelFile);

% 保存数据到 mnist_uint8.mat 文件
save('mnist_uint8.mat', 'train_x', 'train_y', 'test_x', 'test_y');
disp('数据已成功保存到 mnist_uint8.mat 文件中');

% 读取MNIST数据的函数定义
function [images, labels] = loadMNIST(imageFile, labelFile)
    % 读取图像数据
    fid = fopen(imageFile, 'rb');
    if fid == -1
        error(sprintf('无法打开图像文件:%s,请检查路径。', imageFile));
    end
    fread(fid, 1, 'int32', 0, 'ieee-be'); % 读取 magic number
    numImages = fread(fid, 1, 'int32', 0, 'ieee-be');
    numRows = fread(fid, 1, 'int32', 0, 'ieee-be');
    numCols = fread(fid, 1, 'int32', 0, 'ieee-be');
    images = fread(fid, inf, 'unsigned char');
    images = reshape(images, numCols * numRows, numImages)'; % 形状: [numImages, numCols * numRows]
    fclose(fid);

    % 读取标签数据
    fid = fopen(labelFile, 'rb');
    if fid == -1
        error(sprintf('无法打开标签文件:%s,请检查路径。', labelFile));
    end
    fread(fid, 1, 'int32', 0, 'ieee-be'); % 读取 magic number
    numLabels = fread(fid, 1, 'int32', 0, 'ieee-be');
    labels = fread(fid, inf, 'unsigned char');
    fclose(fid);

    % 将标签转换为 one-hot 编码
    labels_onehot = zeros(numLabels, 10); % 创建 [numLabels, 10] 矩阵
    for i = 1:numLabels
        labels_onehot(i, labels(i) + 1) = 1; % 将标签位置置为 1 (MATLAB索引从1开始)
    end
    labels = labels_onehot;
end

数据预处理后生成mnist_uint8.mat文件

2.实现脚本

clc; clear; close all;

% 加载数据集
load('mnist_uint8.mat');
n = 700; % 训练集大小

% 数据划分
train_x = train_x(1:n, :);
train_y = train_y(1:n, :);
test_x = test_x(1:end, :);
test_y = test_y(1:end, :);

% 数据预处理 - 将数据归一化到 [0, 1] 范围
train_x = double(train_x) / 255; % 归一化训练数据
test_x = double(test_x) / 255;   % 归一化测试数据

% 重塑数据以适应 CNN 输入(假设 MNIST 图片大小为 28x28)
trainD = reshape(train_x', 28, 28, 1, n);
testD = reshape(test_x', 28, 28, 1, size(test_x, 1));

% 将目标数据转换为分类标签
trainLabels = categorical(vec2ind(train_y') - 1);
testLabels = categorical(vec2ind(test_y') - 1);

% 定义卷积神经网络结构
layers = [
    imageInputLayer([28 28 1])  % 使用 28x28 大小的输入层
    convolution2dLayer(3, 16, 'Padding', 'same')
    reluLayer
    maxPooling2dLayer(2, 'Stride', 2)
    fullyConnectedLayer(384)
    reluLayer
    fullyConnectedLayer(384)
    fullyConnectedLayer(10)  % 输出层调整为 10 类
    softmaxLayer  % 使用 softmax 层来生成概率分布
    classificationLayer  % 替换为分类层
];

% 训练选项设置
options = trainingOptions('adam', ...
    'MaxEpochs', 20, ...
    'MiniBatchSize', 16, ...
    'InitialLearnRate', 0.005, ...
    'GradientThreshold', 1, ...
    'Verbose', false, ...
    'Plots', 'training-progress', ...
    'ValidationData', {testD, testLabels});

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

% 测试网络
YPred = classify(net, testD);

% 计算准确率
accuracy = sum(YPred == testLabels) / numel(testLabels) * 100;
disp(['测试集准确率: ', num2str(accuracy), '%']);

五、 实验结果

在这里插入图片描述
在这里插入图片描述

六、 实验心得

本实验实现了基于卷积神经网络的MNIST手写数字分类。通过加载和预处理数据,将图像像素值归一化,调整为CNN输入格式。本次实验展示了卷积神经网络在图像分类任务中的有效性,为其他图像识别任务提供了参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianqianaao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值