• 基于Theano的DL的开源小框架:Dragon


    Link:https://github.com/neopenx/Dragon 

    起因

    最近看了Hinton的Dropout,发现原来的乱代码只能在Softmax层前面加Dropout。索性把整个Theano封装了一遍了。

    瞄了几眼Github上的Theano的另外一个封装Keras,然后按照自己风格手写了(看别人源码头疼)

    Theano目前真是日薄西山了。Bengio做出了之后就不管了。直接去搞Pylearn2了

    关键是Pylearn2还没有Caffe友好,CVPR15上,Caffe还展开了铺天盖地的宣传攻势。

    尽管Github上各路大神各种Fork,但是最大问题是,CUDA部分根本没人能写。

    由于Theano的工作方式类似函数式语言,像个黑盒子,留给User的空间也只有矩阵运算。

    For循环之类的逻辑语句,就得重写CUDA。

    特别是在CNN上,很多都是2012年后提出的非常重要的改善,不知道为什么不写了:

    • Avg Pooling

    • Overlapping Pooling

    • Pooling with Padding

    • Local Connected Layer

    • Convolution with Maxout

    • Convolution with Padding

    所以,目前除了Bengio组自己搞的Pylearn2外,大部分Theano的封装项目看起来都差不多。就是把教程封装一下。

    目前的实现

    1. Layer

    • DataLayer

    • SoftmaxLayer

    • FullyConnectedLayer

    • ConvolutionLayer

    • PoolingLayer(MAX)

    • AutoEncodeLayer(Denoising)

    • DropoutLayer

    2. Alogorithm

    • Mini_Batch

    • Pre_Training

    3. Activation

    • Logistic

    • Tanh

    • ReLu

    • Softplus

    4. Weight_Init

    • Xavier(Logistic&Tanh)

    • Gaussian (Zero Mean)

    数据处理

    1.1 数据制作

    在 data.process 下的 build_data(filename="data.pkl"):

    这是个对二进制bin文件转换成python的pkl函数:

    bin格式数据排布参照cifar10:http://www.cs.toronto.edu/~kriz/cifar.html

    第一字节为label,后面每个字节代表一个pixel。

    同时,参照了Caffe中强制计算mean的做法,顺带计算出了mean.pkl

    1.2 数据输入

    在 data.process 下的 loadData():

    采用Theano的DL教学中的标准格式:

    trainSet_X,trainSet_Y=sharedDataSet(trainSet)
    vaildSet_X,vaildSet_Y=sharedDataSet(vaildSet)
    dataSet=[(trainSet_X,trainSet_Y),(vaildSet_X,vaildSet_Y)]

    不过默认还读取了mean.pkl

    样例

    1. Cifar10_CNN

    from layer.core import *
    from algorithm.SGD import Mini_Batch
    from data.process import loadData
    from layer.model import Model
    if __name__ == '__main__':
        dataSet=loadData()
        cifar=Model(batch_size=100,lr=0.001,dataSet=dataSet,weight_decay=0.004)
        neure=[32,32,64,64]
        batch_size=100
        cifar.add(DataLayer(batch_size,(32,32,3)))
        cifar.add(ConvolutionLayer((batch_size,3,32,32),(neure[0],3,3,3),'relu','Gaussian',0.0001))
        cifar.add(PoolingLayer())
        cifar.add(ConvolutionLayer((batch_size,neure[0],15,15),(neure[1],neure[0],4,4),'relu','Gaussian',0.01))
        cifar.add(PoolingLayer())
        cifar.add(ConvolutionLayer((batch_size,neure[1],6,6),(neure[2],neure[1],5,5),'relu','Gaussian',0.01))
        cifar.add(PoolingLayer())
        cifar.add(FullyConnectedLayer(neure[2]*1*1,neure[3],'relu','Gaussian',0.1))
        cifar.add(DropoutLayer(0.5))
        cifar.add(SoftmaxLayer(neure[3],5,'Gaussian',0.1))
        cifar.build_train_fn()
        cifar.build_vaild_fn()
        algorithm=Mini_Batch(model=cifar,n_epochs=100,load_param='cnn_params.pkl',save_param='cnn_params.pkl')
        algorithm.run()
        
    View Code

    2. Cifar10_MLP

    from layer.core import *
    from algorithm.SGD import Mini_Batch
    from data.process import loadData, loadScaleData
    from layer.model import Model
    if __name__ == '__main__':
        dataSet=loadScaleData('data.pkl')
        cifar=Model(batch_size=100,lr=0.01,dataSet=dataSet,weight_decay=0.0)
        neure=[1000,1000,1000]
        batch_size=100
        cifar.add(DataLayer(batch_size,32*32*3))
        cifar.add(FullyConnectedLayer(32*32*3,neure[0],'relu','Gaussian',0.1))
        cifar.add(DropoutLayer(0.2))
        cifar.add(FullyConnectedLayer(neure[0],neure[1],'relu','Gaussian',0.1))
        cifar.add(DropoutLayer(0.2))
        cifar.add(FullyConnectedLayer(neure[1],neure[2],'relu','Gaussian',0.1))
        cifar.add(DropoutLayer(0.2))     
        cifar.add(SoftmaxLayer(neure[2],10))
        cifar.pretrain()
        cifar.build_train_fn()
        cifar.build_vaild_fn()
        algorithm=Mini_Batch(model=cifar,n_epochs=100,load_param='mlp_params.pkl',save_param='mlp_params.pkl')
        algorithm.run()
        
    View Code
  • 相关阅读:
    范畴定义
    泛函编程(0)-什么是泛函编程
    函数式语言的特性
    理解函数式编程
    未阅归档
    monad-本质解释- a monad is a design pattern--monad与泛型相关
    打印管理系统
    函数式JS: 原来promise是这样的monad
    Promise是Monad吗?
    Scala和范畴论 -- 对Monad的一点认识
  • 原文地址:https://www.cnblogs.com/neopenx/p/4599004.html
Copyright © 2020-2023  润新知