不使用框架实现卷积神经网络(Python)
之前为了对卷积神经网络有更深入的了解,结合别人的成果和自己的思考,在仅使用numpy和cv2的前提下,实现了深度卷积神经网络,并使用mnist数据集进行了训练和测试。不过速度真的非常慢,代码:https://github.com/WepLeo/cnn_without_frame。
主要参考了这两个:
自己遇到的问题
自己之前卡住的地方,有俩:一个是卷积层的反向传播,这个之前看博客推公式搞了好久;另一个是参数初始化,之前使用框架的时候没用心,导致卡了好久。怪自己之前考虑不深入。
卷积层的反向传播
这一块,看好多人都是根据前后两层的关系(conv-conv, conv-pooling…),分不同情况讨论,一直不是很理解(我觉得每一层都是独立的啊,为啥还要分情况讨论,希望有人明示),只有刘建平的博客是将每一层独立开的,才看明白。卷积层的反向传播中,在计算梯度时,就是在找前向传播中,两两相乘的另一半,以及与该乘积相关的那次求和的结果。我们可以记住对应的另一半以及求和结果,也可以通过翻转的方式找到,但是要注意padding和步长的影响,下面是input_size=(6,6), kernel_size=(3,3),padding=1,步长为1时的正反向传播过程:
正向传播
反向传播
初始化
之前一直都是使用框架,参数的初始化都是默认的,就没在意,结果就想当然的使用正太分布初始化了,结果训练的时候死活都不收敛,而且loss总是NAN,打印每一层的输出,发现后面几层绝对值都特别大,最后才发现是参数初始化的值数量级大了的原因,使用glorot_uniform后分分钟就看到效果了,最后精度为98%左右。
总结
写的非常粗糙,欢迎交流。