DeepLearningtoolbox(3):cnnsetup.m

来源:互联网 发布:通达信数据文件夹 编辑:程序博客网 时间:2024/05/17 05:58
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大小的卷积核卷积上一层的特征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}.outputmapsfan_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));endnet.layers{l}.b{j} = 0; end%只有在卷积的时候会改变特征map的个数,在池化时并不会改变;卷积层输出的特征map数就是下一层的输入特征map数量。inputmaps = net.layers{l}.outputmaps; endend%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  
0 0
原创粉丝点击