神经网络实现手写MNIST数字识别

本文由用户“liumingsen”分享发布 更新时间:2022-08-01 11:41:06 举报文档

以下为《神经网络实现手写MNIST数字识别》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

神经网络实现手写数字识别(MNIST)

原理:

神经网络的结构如下,第一层为输入层,可以对输入数据进行 normalization, 将输入进行一些转换使其符合高斯分布。因为如果不做转换后面与权重相乘,相加后有可能变得过大,不便于计算处理。下图第二层每个神经元其实可以看成是一般的多变量线性回归,每个神经元做的事就是把上一层的每个输入乘于相应的权重w,最后再加上偏差b,得到结果为 z。z 在通过激活函数(activation function)处理后再传入下一层。到达最后一层后还需要定义一个损失函数(Cost Function)来衡量模型预测的结果与实际的结果之间的误差,而我们的目标就是使得这个损失函数的值最小。

/

项目结构:

开发环境:

MATLAB2020A

训练集:

本项目MNIST训练集由train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gzt10k-images-idx3-ubyte.gzt10k-labels-idx1-ubyte.gz4个文件提供,其中?t10k-images-idx3-ubyte包含10000个样本

t10k-labels-idx1-ubyte包含10000个标签

train-images-idx3-ubyte包含60000个样本

train-labels-idx1-ubyte包含60000个标签

读取数据代码:

% data read

fImg = fopen('train-images.idx3-ubyte');

offset = fseek(fImg,0,'bof');

magicNumber = swapbytes(uint32(fread(fImg,1,'uint32')));

dataNumber = swapbytes(uint32(fread(fImg,1,'uint32')));

rowN = swapbytes(uint32(fread(fImg,1,'uint32')));

colN = swapbytes(uint32(fread(fImg,1,'uint32')));

%%

dataImg=double(swapbytes(uint8(fread(fImg,[rowN*colN,dataNumber],'uint8'))));

fclose(fImg);

fLab = fopen('train-labels.idx1-ubyte');

offset = fseek(fLab,8,'bof');

dataLab = swapbytes(uint8(fread(fLab,[dataNumber],'uint8')));

dataLabMat = zeros(10,dataNumber);

fclose(fLab);

for i=1:dataNumber

dataLabMat(uint32(dataLab(i))+i*10-9) = 1;

end

%%

神经网络初始化代码:

% NeuralNets modeling 1 -random initialize

% layerN is the modle definition, which tells you homany units per layer

layerN = [rowN*colN 64 16 10];

w1 = double((rand(layerN(1),layerN(2))-0.5)/512);

b1 = double((rand(layerN(2),1)-0.5)/512);

w2 = double((rand(layerN(2),layerN(3))-0.5)/4);

b2 = double((rand(layerN(3),1)-0.5)/4);

w3 = double((rand(layerN(3),layerN(4))-0.5)/16);

b3 = double((rand(layerN(4),1)-0.5)/16);

%%

训练代码:

% learning loop

lRate = 0.0004; % acts very bad when it is lager than 0.0004

epoch = 1000; % too lagert may over-trained or have NaN/Inf in model, less than 4k is safe

epochSize = 500; % this can smooth the training process but SLOW it down

los = [];

accuracy = [];

title('Training start!')

pause(0);

tic;

for i=1:epoch

% data select

randomSelect = randi(dataNumber,1,epochSize);

epochImg = dataImg(:,randomSelect);

epochLab = dataLabMat(:,randomSelect);

% model calculate

z1 = double(w1.'*epochImg + b1);

a1 = double(max(z1,0.01*z1));% Leaky ReLU

z2 = double(w2.'*z1 + b2);

a2 = double(max(z2,0.01*z2));

z3 = double(w3.'*z2 + b3);

a30 = double(min(exp(z3),10e300));

a3 = double(a30./sum(a30));

% grident calculate

dz3 = double(a3-epochLab);

dw3 = double(a2*(dz3.')/epochSize);

db3 = double(sum(dz3.').'/epochSize);

da2 = double(w3*dz3);

dg2 = double(z2);

dg2(find(z2>=0)) = double(1);

dg2(find(z2=0)) = double(1);

dg2(find(z2

以上为《神经网络实现手写MNIST数字识别》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览

热门关注

相关下载