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

实战+原理–手写数字识别–卷积神经网络–matlab
Marshal Zheng
2019-04-13

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

转换完:

img

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卷积神经网络–+个人理解

  • 19
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 45
    评论
卷积神经网络(Convolutional Neural Networks,简称CNN)是一种在图像处理中非常重要的神经网络结构。它可以用于手写体数字识别等任务。下面是一个使用CNN进行手写体数字识别的示例: ```python import tensorflow as tf from tensorflow.keras.datasets import mnist # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 数据预处理 x_train = x_train.reshape(-1, 28, 28, 1) / 255.0 x_test = x_test.reshape(-1, 28, 28, 1) / 255.0 y_train = tf.keras.utils.to_categorical(y_train, num_classes=10) y_test = tf.keras.utils.to_categorical(y_test, num_classes=10) # 构建卷积神经网络模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test)) # 评估模型 test_loss, test_acc = model.evaluate(x_test, y_test) print('Test accuracy:', test_acc) ``` 这个示例使用了TensorFlow和Keras库来构建和训练一个卷积神经网络模型,用于手写体数字识别任务。模型首先加载了MNIST数据集,并进行了数据预处理。然后,通过添加卷积层、池化层、全连接层和输出层来构建了一个简单的卷积神经网络模型。最后,使用训练集对模型进行训练,并使用测试集评估模型的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值