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
相关文章推荐
- Leetcode 416. Partition Equal Subset Sum[medium]
- 第十六周项目3-归并排序算法的改进
- 数据结构实验之排序七:选课名单
- 12 款 JS 代码测试必备工具(翻译)
- 如何使用 Git 管理二进制大对象
- eclipse+sdk+adk安卓开发环境部署
- 第十六周项目1-(3)直接选择排序
- PAT1009. 说反话 (20)
- socket发送结构体
- 【大风】Add与高精度加法两题的代码分享:atoi和sprint函数
- dhcp
- 【软件架构】网站架构演化
- Centos7+Nginx通过windows CA颁发及配置SSL服务 推荐
- 安卓应用分配的内存大小
- Object Detection 2015
- Web开发常用到的JavaScript代码区别和经验总结
- 针对phpstudy安装的时候出现 unknown storage engine innodb
- 判断一个字符串中的字符是否唯一
- 个人银行账户管理程序3.0
- 子网掩码和网关的作用