实战+原理--手写数字识别--CNN卷积神经网络--matlab

实战+原理–手写数字识别–卷积神经网络–matlab

Marshal Zheng
2019-04-13

文章目录

        • 实战+原理--手写数字识别--卷积神经网络--matlab
          • Target
          • Dataset
          • Dataset-converted into bmp
          • Train
          • Test
          • Result
          • Theory about CNN (Convolutional Neural Networks)

Target

使用卷积神经网络进行手写数字识别–进一步理解CNN实现,便于拓展

Dataset

不可能让我们自己手写吧……绝望脸……

总有一些经典的数据库!

Therefore,使用谷歌实验室的手写数字数据库THE MINIST DATABASE

在这里[MINIST DATABASE],界面如此简单……看来追求的是内涵!

Dataset-converted into bmp

数据集的格式让人绝望-(-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

转换完:

实战+原理--手写数字识别--CNN卷积神经网络--matlab_第1张图片

Train

使用一定的样本去训练卷积神经网络(不要用全部,如果电脑性能不够~会疯掉的)

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
Test
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
Result

真实数字为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

效果不错嘛……

Theory about CNN (Convolutional Neural Networks)

这里我的另一篇笔记:花书《Deep learning》的学习–CNN卷积神经网络–+个人理解

你可能感兴趣的:(matlab,机器学习,深度学习)