专栏首页量化投资与机器学习深度学习Matlab工具箱代码注释之cnnff.m

深度学习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  

量化投资与机器学习

知识、能力、深度、专业

勤奋、天赋、耐得住寂寞

本文分享自微信公众号 - 量化投资与机器学习(ZXL_LHTZ_JQXX)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-11-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深度学习Matlab工具箱代码注释之cnnsetup.m

    %%========================================================================= %...

    量化投资与机器学习微信公众号
  • 深度学习Matlab工具箱代码注释之cnnbp.m

    %%========================================================================= %...

    量化投资与机器学习微信公众号
  • 深度学习Matlab工具箱代码注释之cnnapplygrads.m

    %%========================================================================= %...

    量化投资与机器学习微信公众号
  • 深度学习Matlab工具箱代码注释之cnnsetup.m

    %%========================================================================= %...

    量化投资与机器学习微信公众号
  • 你无法想象,物联网对制造自动化的影响有多大

    物联网不仅是将工业网络扩展到设备级架构,还包括将安全、运动、机器对机器智能、自动维护资源和企业连接性融入到目前难以企及的制造智能。从资源管理到智能机器设备再到预...

    机器人网
  • Java程序员,想跳槽又怕陷入恶性循环,怎么办?

    有问有答是程序视界的一个免费问答栏目,感兴趣的朋友,可以按照下面的方式参与: 我每周会慎重回答一个问题并整理成文章,(周四晚上)发布在订阅号程序视界内。 ? 您...

    企鹅号小编
  • Zabbix自动生成报表并发送邮件

    通过zabbix api获取需要用到的事件内容,其中包含报警主机名,主机id,触发器,触发器严重性

    没有故事的陈师傅
  • Golang 语言使用标准库 net/rpc/jsonrpc 包跨语言远程调用

    Go 语言标准库 net/rpc 默认采用 encoding/gob 包编解码传输数据,gob 编解码方式仅适用于 Go 应用,如果需要跨语言远程调用,可以指定...

    frankphper
  • 火热报名 | 2019腾讯犀牛鸟师资培训计划

    伴随着大数据、云计算和人工智能等新技术的发展和普及,信息技术已经成为推动各行各业快速发展的重要推手和工具。为积极响应国家及教育部的政策方针,支持和推动新工科专...

    腾讯高校合作
  • [Python聚类] 离散点检测 (K-Means聚类方法)

    聚类分析用于发现局部强相关的对象组,而异常检测用来发现不与其他对象强相关的对象。  因此,聚类分析可以用于离散度检测。

    用户7886150

扫码关注云+社区

领取腾讯云代金券