随机挑选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里面的内容。