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()

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()

基于Theano的DL的开源小框架:Dragon的更多相关文章

  1. (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

    特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

  2. 分享一个以前写的基于C#语言操作数据库的小框架

    一:前言 这个是以前写的操作MySQL数据库的小型框架,如果是中小型项目用起来也是很不错的,里面提供Filter.ModelPart.Relationship等机制实现操作数据库时的SQL语句的拼接和 ...

  3. 利用jdbc简单封装一个小框架(类似DBUtils)

    利用jdbc写的一个类似DBUtils的框架 package com.jdbc.orm.dbutils; import java.io.IOException; import java.io.Inpu ...

  4. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese

  5. 两个基于C++/Qt的开源WEB框架

    1.tufao 项目地址: https://github.com/vinipsmaker/tufao 主页: http://vinipsmaker.github.io/tufao/ 介绍: Tufão ...

  6. 基于Theano的深度学习框架keras及配合SVM训练模型

    https://blog.csdn.net/a819825294/article/details/51334397 1.介绍 Keras是基于Theano的一个深度学习框架,它的设计参考了Torch, ...

  7. 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)

    一 源码位置 1. Winform框架 2. web框架 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分人学习软件开发技术是通过看书,看视频,听老师上课的方式.这些方式有一个共同点即按知 ...

  8. 开源一个基于dotnet standard的轻量级的ORM框架-Light.Data

    还在dotnet framework 2.0的时代,当时还没有EF,而NHibernate之类的又太复杂,并且自己也有一些特殊需求,如查询结果直接入表.水平分表和新增数据默认值等,就试着折腾个轻量点O ...

  9. GPUImage ==> 一个基于GPU图像和视频处理的开源iOS框架

    Logo 项目介绍: GPUImage是Brad Larson在github托管的开源项目. GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机 ...

随机推荐

  1. KMP算法学习

    kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...

  2. NSDatePicker && NSDate

    UIDatePicker *datePicker = [[UIDatePicker alloc]init]; datePicker.datePickerMode = UIDatePickerModeD ...

  3. mysql的存储过程

    mysql5中开始引入存储过程,存储过程是一组为了完成特定功能的sql语句集,经编译后存储在数据库中. 存储过程的特点(优点): 1:减小网络通信量.调用一个行数不多的存储过程与直接高用SQL语名的网 ...

  4. SQL中的JOIN类型解释(CROSS, INNER,OUTER),关键字ON,USING

    书上讲得明白,解了不少迷惑. SELECT e.fname, e.lname, d.name FROM employee AS e INNER JOIN department AS d ON e.de ...

  5. [JavaCore]JAVA中的泛型

    JAVA中的泛型 [更新总结] 泛型就是定义在类里面的一个类型,这个类型在编写类的时候是不确定的,而在初始化对象时,必须确定该类型:这个类型可以在一个在里定义多个:在一旦使用某种类型,在类方法中,那么 ...

  6. 学习linux内核时常碰到的汇编指令(1)

     转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...

  7. 生成n位随机字符串

    --1.借助newid() Go --创建视图(因为在函数中无法直接使用newid()) create view vnewid as select newid() N'MacoId'; go --创建 ...

  8. python 简单的txt文件读写

    1 读取txt文件.跟c相比,python的文件读写简直是方便的可怕 首先是读取文件 首先获得文件名称,然后通过 open函数打开文件,通过for循环逐行读出文件内容 #!python file by ...

  9. Liferay 6.2 改造系列之十二:修改Portal设置页面表单内容

    将Portal设置页面中无用的内容删除: 在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of ...

  10. JavaScript内置对象(字符串,数组,日期的处理)

    Date 日期对象 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义一个时间对象 : var Udate=new Date(); 注意:使用关键字new,Date()的首 ...