以下为《神经网络实现手写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数字识别》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。