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

%%=========================================================================  
%函数名称:cnntrain()  
%输入参数:net,神经网络;x,训练数据矩阵;y,训练数据的标签矩阵;opts,神经网络的相关训练参数  
%输出参数:net,训练完成的卷积神经网络  
%算法流程:1)将样本打乱,随机选择进行训练;  
%         2)取出样本,通过cnnff2()函数计算当前网络权值和网络输入下网络的输出  
%         3)通过BP算法计算误差对网络权值的导数  
%         4)得到误差对权值的导数后,就通过权值更新方法去更新权值  
%注意事项:1)使用BP算法计算梯度  
%%=========================================================================  
function net = cnntrain(net, x, y, opts)  
m = size(x, 3);                      %m保存的是训练样本个数  
disp(['样本总个数=' num2str(m)]);  
numbatches = m / opts.batchsize;     %numbatches表示每次迭代中所选取的训练样本数  
if rem(numbatches, 1) ~= 0           %如果numbatches不是整数,则程序发生错误  
    error('numbatches not integer');  
end  
 
%%=====================================================================  
%主要功能:CNN网络的迭代训练  
%实现步骤:1)通过randperm()函数将原来的样本顺序打乱,再挑出一些样本来进行训练  
%         2)取出样本,通过cnnff2()函数计算当前网络权值和网络输入下网络的输出  
%         3)通过BP算法计算误差对网络权值的导数  
%         4)得到误差对权值的导数后,就通过权值更新方法去更新权值  
%注意事项:1)P = randperm(N),返回[1, N]之间所有整数的一个随机的序列,相当于把原来的样本排列打乱,  
%            再挑出一些样本来训练  
%         2)采用累积误差的计算方式来评估当前网络性能,即当前误差 = 以前误差 * 0.99 + 本次误差 * 0.01 
%            使得网络尽可能收敛到全局最优  
%%=====================================================================  
net.rL = [];                         %代价函数值,也就是误差值  
for i = 1 : opts.numepochs           %对于每次迭代  
    disp(['epoch ' num2str(i) '/' num2str(opts.numepochs)]);  
    tic;                             %使用tic和toc来统计程序运行时间  
 
    %%%%%%%%%%%%%%%%%%%%取出打乱顺序后的batchsize个样本和对应的标签 %%%%%%%%%%%%%%%%%%%%  
    kk = randperm(m);                 
 for l = 1 : numbatches  
        batch_x = x(:, :, kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize));  
        batch_y = y(:,    kk((l - 1) * opts.batchsize + 1 : l * opts.batchsize));  
 
        %%%%%%%%%%%%%%%%%%%%在当前的网络权值和网络输入下计算网络的输出(特征向量)%%%%%%%%%%%%%%%%%%%%  
        net = cnnff(net, batch_x); %卷积神经网络的前馈运算  
 
        %%%%%%%%%%%%%%%%%%%%通过对应的样本标签用bp算法来得到误差对网络权值的导数%%%%%%%%%%%%%%%%%%%%  
        net = cnnbp(net, batch_y); %卷积神经网络的BP算法  
 
        %%%%%%%%%%%%%%%%%%%%通过权值更新方法去更新权值%%%%%%%%%%%%%%%%%%%%  
        net = cnnapplygrads(net, opts);  
 
 if isempty(net.rL)  
            net.rL(1) = net.L;     %代价函数值,也就是均方误差值 ,在cnnbp.m中计算初始值 net.L = 1/2* sum(net.e(:) .^ 2) / size(net.e, 2);         
        end  
        net.rL(end + 1) = 0.99 * net.rL(end) + 0.01 * net.L; %采用累积的方式计算累积误差  
    end  
    toc;  
end  
end  

量化投资与机器学习

知识、能力、深度、专业

勤奋、天赋、耐得住寂寞

原文发布于微信公众号 - 量化投资与机器学习(ZXL_LHTZ_JQXX)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术小站

吴恩达深度学习笔记 3.1~3.11 浅层神经网络

神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑回归多了一层,多出的中间一层叫隐藏层,那么,神经网络的计算就相当于多进行一次逻辑回归的计算

15920
来自专栏AI科技评论

深度 | 详解CVPR2017最佳论文提名的 YOLO 2与 YOLO 9000物体检测系统

AI 科技评论按:YOLO是Joseph Redmon和Ali Farhadi等人于2015年提出的第一个基于单个神经网络的目标检测系统。在今年CVPR上,Jo...

51070
来自专栏深度学习与计算机视觉

Object Detection系列(三) Fast R-CNN

Object Detection系列(一) R-CNN Object Detection系列(二) SPP-Net Object Detectio...

48750
来自专栏机器学习养成记

k折交叉验证(R语言)

“ 机器学习中需要把数据分为训练集和测试集,因此如何划分训练集和测试集就成为影响模型效果的重要因素。本文介绍一种常用的划分最优训练集和测试集的方法——k折交叉验...

2.6K90
来自专栏机器学习原理

深度学习——目标检测(1)什么是目标检测?RCNNRCNN的检测流程:Bounding-box回归

前言:深度学习在图像的应用中目标检测是最基本也是最常用的,下面介绍几种常见的目标检测算法或者模型

18220
来自专栏杂七杂八

matlab留出法实现

留出法(hold-out) 方法:直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,即.在S上训练出模型后,用T来评估其作为测...

72290
来自专栏决胜机器学习

神经网络和深度学习(三) ——浅层神经网络的表示与输出

神经网络和深度学习(三)——浅层神经网络的表示与输出 (原创内容,转载请注明来源,谢谢) 一、神经网络的表示 神经网络,实质上是一些输入,经过多层神经元的处理...

42780
来自专栏Deep learning进阶路

深度学习论文笔记(七)---Deconvolution network-2016年(Learning Deconvolution Network for Semantic Segmentation )

深度学习论文笔记(七)---Deconvolution network Learning Deconvolution Network for Semantic...

1.8K00
来自专栏决胜机器学习

卷积神经网络(一)——卷积、边缘化与池化层

卷积神经网络(一) ——卷积、边缘化与池化层 (原创内容,转载请注明来源,谢谢) 一、概述 卷积神经网络网络(Convolutional Neural Netw...

704110
来自专栏ml

读RCNN论文笔记

1. RCNN的模型(如下图)描述:              RCNN相比传统的物体检测,还是引入传统的物体检测的基本流程,先找出候选目标物体,逐个的提取特征...

34660

扫码关注云+社区

领取腾讯云代金券