这节实现反向传播。
首先当一个图片输出结果output之后,将其与label相减取绝对值,这个 就是误差,然后对每一个w求出偏导,乘以一个步长再用相应的w减去它。
在每一轮循环,随机选几十个物品,然后每个物品随机选四五张图像,总共就有几百张图像,作为一轮,然后重复几千轮,这样就训练好了。
例如我们可以随机选50个物体,每个物体10张图片,代码如下:
path = '101_ObjectCategories';
namelist = dir(path);
for i = 1:50 % 挑出50个物体
if namelist(i).name == '.'
continue;
end
k = rand(101); % 随机选择一个文件夹
name = namelist(k).name;
imglist = dir(strcat(path,'\',name));
len = length(imglist);
for j = 1:10 % 挑选10个图像
t = rand(len); % 随机选择一个图像
img = imread(strcat(path,'\',name,'\',imglist(t).name));
end
end
然后将每张图像送入网络中,然后得出结果与label相减,取得差值:
w1 = rand(5000, 4800);
b1 = rand(5000, 1);
w2 = rand(101, 5000);
b2 = rand(101, 1);
path = '101_ObjectCategories';
namelist = dir(path);
for i = 1:50 % 挑出50个物体
if namelist(i).name == '.'
continue;
end
k = rand(101); % 随机选择一个文件夹
label = zeros(101, 1);
label(k,1) = 1;
name = namelist(k).name;
imglist = dir(strcat(path,'\',name));
len = length(imglist);
for j = 1:10 % 挑选10个图像
t = rand(len); % 随机选择一个图像
img = imread(strcat(path,'\',name,'\',imglist(t).name));
img = rgb2gray(img);
img = imresize(img, [60, 80]);
input = reshape(img, 4800, 1);
input = im2double(input);
hide = sigmoid_mat(w1*input+b1);
output = sigmoid(w2*hide+b2);
e = abs(output - label);
end
end
这样就得出了差值,然后根据差值设计反向传播公式。从w2到w1,每一个w都减去一个值,这个值是导数乘以一个步长,这个步长a定义为0.01,可能并不是很好,但是以后慢慢改。
a = 0.01;
w2 = w2 - a*d2(e, output);
b2 = d2 - a*d2(e, output);
w1 = w1 - a*d1(e, w2);
b1 = b1 - a*d1(e, d1);