Matlab实现图像识别(九)

随机挑选50个物体,每个物体挑选20张图片。

imgs, labels = img_pick(path)

其中,imgs为50202828,label就是50101了,那么,预处理就在img_pick中做。

function [imgs, labels] = img_pick(path)
    imgs = zeros(50, 20, 28, 28);
    labels=zeros(50, 101);
    namelist = dir(path);
    for i = 1:50 % 挑出50个物体
        k = rand(101); % 随机选择一个物体
        if namelist(k).name == '.',continue,end
        labels(i,k) = 1; % 标签设置
        imglist = dir(strcat(path,'\',namelist(k).name));
        len = length(imglist);
        for j = 1:20 % 挑选20个图像
            t = rand(len); % 随机选择一个图像
            if imglist(t).name == '.',continue,end
            img = imread(strcat(path,'\',namelist(k).name,'\',imglist(t).name));
            img = img_preprocess(img);
            imgs(i, j) = img;
        end
    end
end
function img = img_preprocess(img)
    img = img_preprocess(img);     % 预处理
    img = rgb2gray(img);           % 灰度化
    img = imresize(img, [28, 28]); % 宽高固定化
    img = im2double(img);          % 转换成输入层
end

那么主代码就非常简单了:

下面看一下CNN_train,在这里呢,我使用了一层卷积,一层池化,两层隐藏层,用两层隐藏层的原因不是为了精度更高 ,而是为了我想学习一下深度网络的那些知识。

w0 = rand(9, 9);     % 卷积层参数w
w1 = rand(784, 784); % 隐藏层参数w
w2 = rand(101, 1);   % 输出层参数w
% 训练代码
path = 'train_set';
for i = 1:10000 % 训练一万次
    imgs, labels = img_pick(path, 50, 20);
    w0, w1, w2 = CNN_train(w0, w1, w2, imgs, labels);
end

很简单了是吧,采用了小批量更新的方法,然后具体的训练被隐藏起来了,只要得出那些参数就足够 ,下面是测试代码:

% 测试代码
path = 'test_set';
res = 0;
for i = 1:1000 % 测试1000次
    imgs, labels = img_pick(path, 20, 5);  % 每次挑选20个物体,每个物体5张照片
    res = res + CNN_test(imgs, labels);
end
res/1000

至此,大致的都已经讲完了,下面就来讲CNN_train和CNN_test里面的内容。

你可能感兴趣的:(MATLAB图像处理,计算机视觉,深度学习,神经网络,matlab)