【神经网络】用python从底层实现一个卷积神经网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37251044/article/details/81290728

1. 背景介绍:卷积神经网络(CNN)

  卷积神经网络(ConvolutionalNeural Network,CNN)是人工神经网络的一种。当前已经成为图像和语音识别领域有十分广泛的应用,特别是在识别位移、缩放及其他形式扭曲不变性的二维图形方面有十分优异的表现,已经成为一个十分重要的研究方向。

  关于CNN的详细解释可以看这篇论文1

  接下来我将实现一个卷积神经网络,用来识别CIFAR-10数据集中的图片,我会给出每一层的前向和后向推导,以及python底层实现,如有什么错误,欢迎指出。

2. 矩阵知识

  矩阵部分知识可以参考一文搞定BP神经网络——从原理到应用(原理篇)

3.网络框架

这里写图片描述
  这个是我们所要搭建的网络,这里讲卷积,池化,激活层,flatten层,全连接层,softmax层都看做独立的层来分析。
  
  因为神经网络的批处理和权重共享特点,这里我设置训练网络是输入每个batch=10的幅图片。这10张图片正向传播时是数据互不干扰的,反向传播时数据共同加和作用残差传递。所以我们可以以单幅图像为参考理解整个网络,在反向传播涉及批处理时我会提出。
  
  如图所示,我只列出了一幅图像的RGB3个通道作为输入,图像像素大小是32*32,所以输入层是[10 3 32 32]的python-list格式。

4.从数据处理开始讲起

  如果你翻阅我的博客,你会发现,我是从7月19日写的“在Windows10下安装anaconda”,之后陆陆续续更新了十几篇文章,而这十几篇文章源于一个目的:从0编写一个底层的CNN网络并可视化每层的map特征。为什么要做这个事,一方面是项目要求,另一方面是我从去年开始入门深度学习,陆陆续续看了几十篇深度学习方面的文献,跑了十几个文献开源代码,当我开始有了新的思路想要仿照着别人的代码实现自己的深度学习网络时,却怎么也不得法门。所以我需要从原理层面和代码层面从头推导一边。
  
  我的底层CNN代码时基于python3+和numpy的,所以你可以在Ubuntu【推荐】或者Windows系统上安装anaconda,然后创建一个python3+的环境。
  
  数据是CIRAF-10,数据的读取请看【cifar-10】:数据读取代码中出现ImportError: cannot import name ‘imread’当然,为什么会写一个报错博客,是因为CIFAR-10数据python提取代码需要安装依赖。
  
  下面是数据去均值,请看我之前博客:【数据预处理】:图像去均值:image mean 和 pixel mean
  

5.正向传播

  
  正向传播有卷积,池化,激活,全连接等,这里我们按照在网络框架的出场顺序依次介绍,注意这里我把每个网络层的正向传播与反向传播写到一篇博客里了,所有,在看正向传播的时候可以将反向传播部分跳过:
  
  正向传播第一站:【Python实现卷积神经网络】:卷积层的正向传播与反向传播+python实现代码
  正向传播第二站:【Python实现卷积神经网络】:池化层的正向传播与反向传播+python实现代码
  正向传播第三站:【Python实现卷积神经网络】:激活层RELU的正向与反向传播+python实现代码
  正向传播第四站:【Python实现卷积神经网络】:全连接层的正向传播与反向传播+python实现代码
  正向传播第五站:【Python实现卷积神经网络】:神经网络的Loss函数:Softmax+Cross Entropy前向传播原理+python实现代码

6.反向传播

反向传播是从softmax开始的,所以,我们先要了解softmax的传播原理,然后从softmax开始反向传播。由于反向传播是倒着传播的,所以我们按照网络框架的反向顺序开始讲解:
  反向传播第一站是:【交叉熵】:神经网络的Loss函数编写:Softmax+Cross Entropy
  反向传播第二站是:【反向传播】:从softmax层开始反向传播
  反向传播第三站是:【反向传播】:全连接层的正向传播与反向传播
  反向传播第四站是:【反向传播】:激活层RELU的正向与反向传播
  反向传播第五站是:【反向传播】:池化层的正向传播与反向传播
  反向传播第六站是:【反向传播】:卷积层的正向传播与反向传播


下边儿是我在组织本博客时的想法,不构成主要内容。

我的博客特点:其它人讲每层的原理的时候只是单幅图像来介绍公式原理,但是应用到代码时是batch处理的,所以前向传播,反向传播,矩阵的加减,求导等和单幅图像不一样。我讲每层原理时,先从简单的一幅图像开始,然后公式均扩展到batch=10的数组上边处理。这样,你再写代码时就会理解它的代码为什么这样写了。

每层主要讲几部分

1.该层作用
2.数学原理及正反向公式
3.批处理公式
4.在公式落实到代码时的步骤
5.在代码中如何将层写成函数

训练网络代码

在我的github中,分步代码讲解在前向传播反向传播讲解的时候附上,总的代码在我的github上边儿

待更新:
1.增加loss下降可视化:https://blog.csdn.net/sinat_28113749/article/details/79079832
2.

会随着我的想法的更新和新的网络的出现而增加。。。

测试网络代码

。。。

。。。统一的残差更新公式【这里我们先分层计算残差公式,然后最后总结推导出 这个统一的残差公式】

【未完待续】

参考:23
https://www.cnblogs.com/charlotte77/p/7783261.html
https://www.cnblogs.com/pinard/p/6494810.html

猜你喜欢

转载自blog.csdn.net/weixin_37251044/article/details/81290728