这份代码是笔者为了巩固神经网络当中反向传播而写的,同时也巩固了一些对于细节的理解,当然由于笔者水平有限,搭建的仅仅是序列模型,而且有些地方没想清楚就开始写了,导致有点冗长,甚至有些地方还有一些bug或者错误,仅用于学习,代码放在https://github.com/Spock343/Seq_Model
由于模型不怎么样,则仅用于做简单的分类(自己生成数据集)
在这个模型中,我将每层得到的结果放在该模型的caches中,将对于该层caches的导数放在模型的dcaches中,将对于权重,偏置和卷积核以及相应的导数放在层当中。这里总共写了四种层,卷积层,池化层,扁平化层和全连接层,由于维度的原因,这里将矩阵的二级指针当中,即caches[l][0][0](l为层数)当中。
首先其中大部分操作都是根据理论直接写的,没什么特别的,这里说一些遇到的困难
在一开始是还没写dropout正则化时,过拟合现象及其严重传统的L2正则化几乎不起效果,在加入dropout之后才稍微解决。
然后是发现训练速度很慢,然后写入Adam优化器之后训练速度很快就上来了。
最后是梯度过大的问题,无论是加了梯度衰减还是,调整学习率都效果不好,但是后来加了梯度裁剪后,才得以解决。
接下来就是调模型和调参数了,在调的过程中可以发现在单层加了很多卷积核的效果远不如做两层卷积核,当时一开始做了两层,卷积核个数分别是16和32,精确度只有85左右,但是改成了三层卷积核个数为4,8和16之后,就可以跑到97了。
之前是用Tensorflow几十句代码实现,很多细节别人都写好了,感觉细节的理解上不太清晰,这次自己写过后,细节的理解加深了不少,继续努力吧。
来源:CSDN
作者:fbryaio15
链接:https://blog.csdn.net/fbryaio15/article/details/103651219