深度学习Matlab工具箱代码注释之cnnff.m
时间:2022-04-24
本文章向大家介绍深度学习Matlab工具箱代码注释之cnnff.m,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
%%=========================================================================
%函数名称:cnnff()
%输入参数:net,神经网络;x,训练数据矩阵;
%输出参数:net,训练完成的卷积神经网络
%主要功能:使用当前的神经网络对输入的向量进行预测
%算法流程:1)将样本打乱,随机选择进行训练;
% 2)讲样本输入网络,层层映射得到预测值
%注意事项:1)使用BP算法计算梯度
%%=========================================================================
function net = cnnff(net, x)
n = numel(net.layers); %层数
net.layers{1}.a{1} = x; %网络的第一层就是输入,但这里的输入包含了多个训练图像
inputmaps = 1; %输入层只有一个特征map,也就是原始的输入图像
for l = 2 : n %对于每层(第一层是输入层,循环时先忽略掉)
if strcmp(net.layers{l}.type, 'c') %如果当前是卷积层
for j = 1 : net.layers{l}.outputmaps %对每一个输入map,需要用outputmaps个不同的卷积核去卷积图像
%%=========================================================================
%主要功能:创建outmap的中间变量,即特征矩阵
%实现步骤:用这个公式生成一个零矩阵,作为特征map
%注意事项:1)对于上一层的每一张特征map,卷积后的特征map的大小是:(输入map宽 - 卷积核的宽 + 1)* (输入map高 - 卷积核高 + 1)
% 2)由于每层都包含多张特征map,则对应的索引则保存在每层map的第三维,及变量Z中
%%=========================================================================
z = zeros(size(net.layers{l - 1}.a{1}) - [net.layers{l}.kernelsize - 1 net.layers{l}.kernelsize - 1 0]);
for i = 1 : inputmaps %对于输入的每个特征map
%%=========================================================================
%主要功能:将上一层的每一个特征map(也就是这层的输入map)与该层的卷积核进行卷积
%实现步骤:1)进行卷积
% 2)加上对应位置的基b,然后再用sigmoid函数算出特征map中每个位置的激活值,作为该层输出特征map
%注意事项:1)当前层的一张特征map,是用一种卷积核去卷积上一层中所有的特征map,然后所有特征map对应位置的卷积值的和
% 2)有些论文或者实际应用中,并不是与全部的特征map链接的,有可能只与其中的某几个连接
%%=========================================================================
z = z + convn(net.layers{l - 1}.a{i}, net.layers{l}.k{i}{j}, 'valid');
end
net.layers{l}.a{j} = sigm(z + net.layers{l}.b{j}); %加基(加上加性偏置b)
end
inputmaps = net.layers{l}.outputmaps; %更新当前层的map数量;
elseif strcmp(net.layers{l}.type, 's') %如果当前层是下采样层
for j = 1 : inputmaps
%%=========================================================================
%主要功能:对特征map进行下采样
%实现步骤:1)进行卷积
% 2)最终pooling的结果需要从上面得到的卷积结果中以scale=2为步长,跳着把mean pooling的值读出来
%注意事项:1)例如我们要在scale=2的域上面执行mean pooling,那么可以卷积大小为2*2,每个元素都是1/4的卷积核
% 2)因为convn函数的默认卷积步长为1,而pooling操作的域是没有重叠的,所以对于上面的卷积结果
% 3)是利用卷积的方法实现下采样
%%=========================================================================
z = convn(net.layers{l - 1}.a{j}, ones(net.layers{l}.scale) / (net.layers{l}.scale ^ 2), 'valid');
net.layers{l}.a{j} = z(1 : net.layers{l}.scale : end, 1 : net.layers{l}.scale : end, :); %跳读mean pooling的值
end
end
end
%%=========================================================================
%主要功能:输出层,将最后一层得到的特征变成一条向量,作为最终提取得到的特征向量
%实现步骤:1)获取倒数第二层中每个特征map的尺寸
% 2)用reshape函数将map转换为向量的形式
% 3)使用sigmoid(W*X + b)函数计算样本输出值,放到net成员o中
%注意事项:1)在使用sigmoid()函数是,是同时计算了batchsize个样本的输出值
%%=========================================================================
net.fv = []; %net.fv为神经网络倒数第二层的输出map
for j = 1 : numel(net.layers{n}.a) %最后一层的特征map的个数
sa = size(net.layers{n}.a{j}); %第j个特征map的大小
net.fv = [net.fv; reshape(net.layers{n}.a{j}, sa(1) * sa(2), sa(3))];
end
net.o = sigm(net.ffW * net.fv + repmat(net.ffb, 1, size(net.fv, 2))); %通过全连接层的映射得到网络的最终预测结果输出
end
量化投资与机器学习
知识、能力、深度、专业
勤奋、天赋、耐得住寂寞
- 走进科学:银行ATM机真的安全吗?
- 漏洞科普:对于XSS和CSRF你究竟了解多少
- 巧用Live Template,不仅能提升AS开发效率,还能装逼
- 黑了前男友网站:从找SQL注入到后台权限
- 扩展CakePHP的CacheHelper以使用缓存引擎
- 走进科学:酒店保险箱真的保险么?
- 利用xmlrpc.php对WordPress进行暴力破解攻击
- .Net中如何操作IIS
- Havex:以工控设备为狩猎目标的恶意软件
- 大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践
- 浅谈php安全
- 在统一的分析平台上构建复杂的数据管道
- 隐藏在注册表的恶意软件 – Poweliks
- 数千万WordPress和Drupal站点存在DDoS风险
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS6.9下NFS服务安装配置教程
- Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
- PHP 枚举类型的管理与设计知识点总结
- Linux静态链接库使用类模板的快速排序算法
- TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
- php post换行的方法
- apache实现部署多个网站(一个ip部署多域名)的方法详解
- windows7 32、64位下python爬虫框架scrapy环境的搭建方法
- python实现简单名片管理系统
- PHP7创建COOKIE和销毁COOKIE的实例方法
- PHP实现新型冠状病毒疫情实时图的实例
- 深入浅析Python2.x和3.x版本的主要区别
- 用户态进程如何得到虚拟地址对应的物理地址?
- Linux中利用grep命令如何检索文件内容详解
- laravel框架学习笔记之组件化开发实现方法