Skip to content

Latest commit

 

History

History
102 lines (67 loc) · 5.66 KB

README-cn.md

File metadata and controls

102 lines (67 loc) · 5.66 KB

中文 | English

RemNet是基于C++编写的开源深度学习框架。它非常容易上手使用,只需要您定义好网络结构并设定相关参数即可开始训练

下载

$ git clone https://github.com/wmathor/RemNet.git

clone到本地之后,请使用Visual Studio导入该项目,然后运行即可,非常简单。您也可以尝试修改myModel.json中的信息,例如添加其它一些层,然后再重新运行。

对了,一开始您不需要准备什么数据,我已经为您提供好了,就在./RemNet/mnist_data

有关RemNet的更多信息

  • 支持目前最常用的层类型:Conv、Pool、FC、ReLU、Tanh、Dropout、BN、Scale
  • 支持两种最常用的损失层:CrossEntropy、SVM
  • 支持多种优化器:SGD、Momentum、RMSProp
  • 支持两种权重初始化:Gaussian、MSRA
  • 支持Fine-tune操作

RemNet的整体编写思路类似于Caffee,它的基本数据类型包括Cube和Blob。在RemNet中,它们之间的关系如下图

下面是一个简单的网络结构示意图,帮助您理解RemNet中的Net、Layer、Blob的关系

设计重点

以MNIST数据集为例,下图展示了它的Images和Labels在RemNet中的存储方式

很明显,对于标签我进行了one-hot Encoding,这方便后面的Loss计算,而且都统一成Blob的格式相比于普通的数据类型更有助于理解,因为绝大多数深度学习问题都是这么做的。

即便是MNIST数据集也有60000个样本,因此无法一次性输入,所以RemNet也支持开发者自己设置batch size。假设我定义了一个超小型的卷积神经网络(Conv->ReLU->Pool->FC->Softmax/SVM),前向传播和反向传播的过程如下图。你会注意到,有些层里面只有x,没有w和b,但为了编程方便,我都声明了,只不过没有使用而已。同样,反向传播的时候也是一样,有的层根本没有w和b梯度信息

传统的CNN操作使用Blob这种数据表示没有什么问题,但如果到了FC Layer呢?我在使用PyToch的时候,几乎在每次在FC Layer之前都会将输入数据进行一次Flatten。RemNet在解决这个问题的时候并没有采用Flatten,因为这会浪费更多时间。RemNet采用的方法类似于"卷积",具体看下图

先看左边,如果您对卷积和全连接不太熟悉,请先回想一下。左边是RemNet的解决方法,对应Channel中每个位置上的值相乘在做和,这是卷积的操作,对于RemNet来说同样也是FC Layer的前向传播过程。如果把每个Cube都Flatten,就变成了右边的形式

FAQ

  1. 与Tensorflow和PyTorch最大的区别是什么?

    Tensorflow我几乎没用过,因为太难学了。PyTorch是我一直使用的深度学习框架,我就说一下RemNet和PyTorch的区别。PyTorch需要自定义优化器,然后传入参数,在迭代过程中还需要梯度清零以及反向传播。但是RemNet不需要这么麻烦,你只需要修改myModel.json的参数,例如使用什么优化器,优化器的权重衰减是多少,剩下的全部交给程序就行了

  2. 为什么起名为RemNet?

    因为我喜欢的一个女生叫レム(雷姆) ,她名字的英文翻译就是Rem:heart:

  3. 我可以做什么?

    你可以fork这个项目,然后为它添加新的功能。如果有人帮忙维护这个项目,我会添加一个"贡献者"名单,期待您成为第一位

  4. 是否可以商用?

    如果您是"贡献者"的一员,我可以考虑。否则不可以,具体的内容请看"LICENSE"

🎨 TODO

  • 实现L2正则化
  • 实现通用的图片数据接口
  • 优化代码,封装为可执行文件
  • 支持循环神经网络
  • 支持GPU训练(有生之年系列)
  • 设计图形界面(有生之年系列×2)

LICENSE

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。