您的位置:首页 > 其它

DeepLearningtoolbox(3):cnnsetup.m

2016-12-13 21:42 246 查看
function net = cnnsetup(net, x, y)
inputmaps = 1;    %初始化网络输入层数为1层
mapsize   = size(squeeze(x(:, :, 1)));%B=squeeze(A) 返回和矩阵A相同元素但所有单一维都移除的矩阵B,单一维是满足size(A,dim)=1的维。train_x中图像的存放方式是三维的reshape(train_x',28,28,60000),前面两维表示图像的行与列,第三维就表示有多少个图像。squeeze(x(:, :, 1))就相当于取第一个图像样本后,再把第三维移除,就变成了28x28的矩阵,也就是得到一幅图像,再size一下就得到了训练样本图像的行数与列数。

%通过传入的net结构体来逐层构建CNN网络
%n=numel(A)返回数组A中的元素个数
%net.layers中5个struct类型的元素实际上就表示CNN一共有5层,这里的范围是5.
for l = 1 : numel(net.layers)                    %对于每一层
if strcmp(net.layers{l}.type, 's')           %若为下采样层
%subsampling层的mapsize,最开始mapsize是每张图的大小28*28,这里除以scale=2,就是pooling之后图的大小,pooling域之间没有重叠,所以pooling后的图像为14*14,注意这里的右边的mapsize保存的都是上一层每张特征map的大小,它会随着循环进行不断更新。
mapsize = mapsize / net.layers{l}.scale;
assert(all(floor(mapsize)==mapsize), ['Layer ' num2str(l) ' size must be integer. Actual: ' num2str(mapsize)]);
% 在函数开始处检验传入参数的合法性(这里的意思是如果使我们自己设计网络,要刚刚好设计得每一个下采样层可以除尽。)
for j = 1 : inputmaps%对于上一层的每个特征图,inputmaps就是上一层特征图的张数。
net.layers{l}.b{j} = 0;    %将偏置初始化为零
end
end

if strcmp(net.layers{l}.type, 'c') %如果当前层是卷基层
%旧的mapsize保存的是上一层的特征map的大小,那么如果卷积核的移动步长是1,那kernelsize*kernelsize大小
4000
的卷积核卷积上一层的特征map后,得到的新的map的大小为:
mapsize=mapsize-net.layers{l}.kernelsize+1;
%该层需要学习的参数个数
%这里fan_out只保存卷积核,偏置在下面独立保存
fan_out = net.layers{l}.outputmaps * net.layers{l}.kernelsize ^ 2;
for j = 1 : net.layers{l}.outputmaps
fan_in = inputmaps * net.layers{l}.kernelsize ^ 2;
for i = 1 : inputmaps

%随机初始化权重
net.layers{l}.k{i}{j} = (rand(net.layers{l}.kernelsize) - 0.5) * 2 * sqrt(6 / (fan_in + fan_out));
end
net.layers{l}.b{j} = 0;
end

%只有在卷积的时候会改变特征map的个数,在池化时并不会改变;卷积层输出的特征map数就是下一层的输入特征map数量。
inputmaps = net.layers{l}.outputmaps;
end
end

%fvnm是输出层的前面一层的神经元个数
fvnum = prod(mapsize) * inputmaps;
onum = size(y, 1);

%这里是最后一层神经网络的设定
%ffb是输出层节点的设置
net.ffb = zeros(onum, 1);

%ffW是输出层前一层与输出层连接的权重,这两层之间是全连接的。
net.ffW = (rand(onum, fvnum) - 0.5) * 2 * sqrt(6 / (onum + fvnum));
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: