RemNet是基于C++编写的开源深度学习框架。它非常容易上手使用,只需要您定义好网络结构并设定相关参数即可开始训练
$ git clone https://github.com/wmathor/RemNet.git
clone到本地之后,请使用Visual Studio导入该项目,然后运行即可,非常简单。您也可以尝试修改myModel.json
中的信息,例如添加其它一些层,然后再重新运行。
对了,一开始您不需要准备什么数据,我已经为您提供好了,就在./RemNet/mnist_data
中
- 支持目前最常用的层类型: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,就变成了右边的形式
-
与Tensorflow和PyTorch最大的区别是什么?
Tensorflow我几乎没用过,因为太难学了。PyTorch是我一直使用的深度学习框架,我就说一下RemNet和PyTorch的区别。PyTorch需要自定义优化器,然后传入参数,在迭代过程中还需要梯度清零以及反向传播。但是RemNet不需要这么麻烦,你只需要修改
myModel.json
的参数,例如使用什么优化器,优化器的权重衰减是多少,剩下的全部交给程序就行了 -
为什么起名为RemNet?
因为我喜欢的一个女生叫レム(雷姆) ,她名字的英文翻译就是Rem:heart:
-
我可以做什么?
你可以
fork
这个项目,然后为它添加新的功能。如果有人帮忙维护这个项目,我会添加一个"贡献者"名单,期待您成为第一位 -
是否可以商用?
如果您是"贡献者"的一员,我可以考虑。否则不可以,具体的内容请看"LICENSE"
- 实现L2正则化
- 实现通用的图片数据接口
- 优化代码,封装为可执行文件
- 支持循环神经网络
- 支持GPU训练(有生之年系列)
- 设计图形界面(有生之年系列×2)
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。