【matcovnet】反向传播详解
本文将在此网络结构的基础上,一步步剖析反向传播的过程。
先简单介绍一下进行前向反向传播的函数vl_simplenn
在matcovnet自带的cnn_train函数中的vl_simplenn函数中,涉及到前向与反向传播的具体计算,具体解析如下:
vl_simplenn 一个针对CNN的具有线性拓扑的轻量级包装器。
x的第一个数据 表示输入的原始数据
先查看其大小
运行到这一步时
得到每层的信息,包括类型,权重,
第一层前向传播,经过卷积后,得到
当l=2时,得到第二层的各种参数
运行完池化的程序后,得到
前向传播大概就是这个样子,直到进行到最后一层softmaxloss
得到loss值
下面进行反向传播介绍:
一开始l=8,对应softmaxloss层,
vi_nnsoftmaxloss既可以做前向传播的函数,也可以当做反向回调的函数。
前向传播时,代码如下:
反向回调时,代码如下:
dzdx为误差,这里初始化为1。
根据这两个值反向传播,得到res(8).dzdx
还是在vl_simplenn中,当遇到卷积层的时候,需要计算dzdw
输入参数 是这俩还有 其原本的w,b(分别为 l.weights{1}, l.weights{2})
为了节约内存,
要清空这俩部分
再次根据这俩个值,得到res(5).dzdx,一直往回调
运行完这一层后,
清空下一层的
整个这段程序 运行完毕后,得到
res结构,根据res结构,可以求出损失值(res(end)),top1err和top5err
可以看到第一次运行结果
top1err为 1180
所以错误率为1180/1220=0.9672