使用卷积神经网络进行手写数字识别–进一步理解CNN实现,便于拓展
不可能让我们自己手写吧……绝望脸……
总有一些经典的数据库!
Therefore,使用谷歌实验室的手写数字数据库THE MINIST DATABASE
在这里[MINIST DATABASE],界面如此简单……看来追求的是内涵!
数据集的格式让人绝望-(-ubyte),怎么读嘛……赶紧去找这种图像格式……
训练集图像格式(train-images.idx3-ubyte)
offset——–type————–value———- description
0000 —32 bit integer——0x00000803—–magic number
0004—32 bit integer——–60000——number of images
0008—32 bit integer———-28———–number of rows
0012—32 bit integer———-28——–number of columns
0016—unsigned byte ——–??——————pixel
0017—unsigned byte ——–??——————pixel……
训练集标签格式(train-labels.idx1-ubyte)
offset——–type—————-value———- description
0000 —32 bit integer——0x00000803—–magic number
0004—32 bit integer——–60000——number of images
0008—unsigned byte ———??——————number
0009—unsigned byte ———??——————number……
然后将其转换成bmp图像
function tobmp
fid_image=fopen('train-images.idx3-ubyte','r');
fid_label=fopen('train-labels.idx1-ubyte','r');
% Read the first 16 Bytes
magicnumber=fread(fid_image,4);
size=fread(fid_image,4);
row=fread(fid_image,4);
col=fread(fid_image,4);
% Read the first 8 Bytes
extra=fread(fid_label,8);
% Read labels related to images
imageIndex=fread(fid_label);
Num=length(imageIndex);
% Count repeat times of 0 to 9
cnt=zeros(1,10);
for k=1:Num
image=fread(fid_image,[max(row),max(col)]); % Get image data
val=imageIndex(k); % Get value of image
for i=0:9
if val==i
cnt(val+1)=cnt(val+1)+1;
end
end
if cnt(val+1)<10
str=[num2str(val),'_',num2str(cnt(val+1)),'.bmp'];
elseif cnt(val+1)<100
str=[num2str(val),'_',num2str(cnt(val+1)),'.bmp'];
elseif cnt(val+1)<1000
str=[num2str(val),'_',num2str(cnt(val+1)),'.bmp'];
else
str=[num2str(val),'_',num2str(cnt(val+1)),'.bmp'];
end
imwrite(image',str);
end
fclose(fid_image);
fclos
转换完:
使用一定的样本去训练卷积神经网络(不要用全部,如果电脑性能不够~会疯掉的)
for iter=1:20
for n=1:20
for m=0:9
%读取样本
train_data=imread(strcat(num2str(m),'_',num2str(n),'.bmp'));
train_data=double(train_data);
% 去均值
% train_data=wipe_off_average(train_data);
%前向传递,进入卷积层1
for k=1:layer_c1_num
state_c1(:,:,k)=convolution(train_data,kernel_c1(:,:,k));
%进入激励函数
state_c1(:,:,k)=tanh(state_c1(:,:,k)+bias_c1(1,k));
%进入pooling1
state_s1(:,:,k)=pooling(state_c1(:,:,k),pooling_a);
end
%进入f1层
[state_f1_pre,state_f1_temp]=convolution_f1(state_s1,kernel_f1,weight_f1);
%进入激励函数
for nn=1:layer_f1_num
state_f1(1,nn)=tanh(state_f1_pre(:,:,nn)+bias_f1(1,nn));
end
%进入softmax层
for nn=1:layer_output_num
output(1,nn)=exp(state_f1*weight_output(:,nn))/sum(exp(state_f1*weight_output));
end
%% 误差计算部分
Error_cost=-output(1,m+1);
% if (Error_cost<-0.98)
% break;
% end
%% 参数调整部分
[kernel_c1,kernel_f1,weight_f1,weight_output,bias_c1,bias_f1]=CNN_upweight(yita,Error_cost,m,train_data,...
state_c1,state_s1,...
state_f1,state_f1_temp,...
output,...
kernel_c1,kernel_f1,weight_f1,weight_output,bias_c1,bias_f1);
end
end
end
for n=1:20
for m=0:9
%读取样本
train_data=imread(strcat(num2str(m),'_',num2str(n),'.bmp'));
train_data=double(train_data);
% 去均值
% train_data=wipe_off_average(train_data);
%前向传递,进入卷积层1
for k=1:layer_c1_num
state_c1(:,:,k)=convolution(train_data,kernel_c1(:,:,k));
%进入激励函数
state_c1(:,:,k)=tanh(state_c1(:,:,k)+bias_c1(1,k));
%进入pooling1
state_s1(:,:,k)=pooling(state_c1(:,:,k),pooling_a);
end
%进入f1层
[state_f1_pre,state_f1_temp]=convolution_f1(state_s1,kernel_f1,weight_f1);
%进入激励函数
for nn=1:layer_f1_num
state_f1(1,nn)=tanh(state_f1_pre(:,:,nn)+bias_f1(1,nn));
end
%进入softmax层
for nn=1:layer_output_num
output(1,nn)=exp(state_f1*weight_output(:,nn))/sum(exp(state_f1*weight_output));
end
[p,classify]=max(output);
if (classify==m+1)
count=count+1;
end
fprintf('真实数字为%d 网络标记为%d 概率值为%d \n',m,classify-1,p);
end
end
真实数字为0 网络标记为0 概率值为9.972138e-01
真实数字为1 网络标记为1 概率值为9.193176e-01
真实数字为2 网络标记为2 概率值为9.896526e-01
真实数字为3 网络标记为3 概率值为9.371080e-01
真实数字为4 网络标记为4 概率值为9.952712e-01
真实数字为5 网络标记为5 概率值为9.003822e-01
真实数字为6 网络标记为6 概率值为9.212196e-01
真实数字为7 网络标记为7 概率值为9.913647e-01
真实数字为8 网络标记为8 概率值为9.930044e-01
真实数字为9 网络标记为9 概率值为9.595271e-01效果不错嘛……
这里我的另一篇笔记:花书《Deep learning》的学习–CNN卷积神经网络–+个人理解