本文目录一览:
- 1、在深度学习中,DNN与DBN两个网络有什么区别
- 2、怎样用python调用已经训练好的caffe
- 3、各种编程语言的深度学习库整理大全!
在深度学习中,DNN与DBN两个网络有什么区别
dnn 从名字上你就可以看出来,是深度神经网络,类比于浅层神经网络,它的训练方法也是BP,没有引入无监督的预训练。隐层的激活函数使用了 ReLU,改善了“梯度弥散”,通过正则化+dropout 改善了过拟合的现象,在输出层 是softmax 作为激活函数。目标函数是交叉熵。
他是一个 有监督的判别模型。
stacked denoised autoencoder (SDA)深度学习结构,和DBN类似 使用 无监督的网络“堆叠”起来的,他有分层预训练来寻找更好的参数,最后使用BP来微调网络。比dnn利用各种算法来初始化权值矩阵,从经验上来看是有帮助的。但是缺点也很明显,每层的贪婪学习权值矩阵,也带来了过长的训练时间。在大量的数据面前 dnn(relu)的效果已经不差于预训练的深度学习结构了。最终DBN也是看成是“生成模型”。
CNN 也没有pre-train过程,训练算法也是用BP。 因为加入卷积 可以更好的处理2D数据,例如图像和语音。并且目前看来 相比其它网络有更好的表现。dnn/dbn/sda 等都是处理1D的数据。
怎样用python调用已经训练好的caffe
定义CAFFE为caffe跟目录,caffe的核心代码都在$CAFFE/src/caffe 下,主要有以下部分:net, blob, layer, solver.
net.cpp:
net定义网络, 整个网络中含有很多layers, net.cpp负责计算整个网络在训练中的forward, backward过程, 即计算forward/backward 时各layer的gradient。
layers:
在$CAFFE/src/caffe/layers中的层,在protobuffer (.proto文件中定义message类型,.prototxt或.binaryproto文件中定义message的值) 中调用时包含属性name, type(data/conv/pool…), connection structure (input blobs and output blobs),layer-specific parameters(如conv层的kernel大小)。定义一个layer需要定义其setup, forward 和backward过程。
blob.cpp:
net中的数据和求导结果通过4维的blob传递。一个layer有很多blobs, e.g,
对data,weight blob大小为Number * Channels * Height * Width, 如256*3*224*224;
对conv层,weight blob大小为 Output 节点数 * Input 节点数 * Height * Width,如AlexNet第一个conv层的blob大小为96 x 3 x 11 x 11;
对inner product 层, weight blob大小为 1 * 1 * Output节点数 * Input节点数; bias blob大小为1 * 1 * 1 * Output节点数( conv层和inner product层一样,也有weight和bias,所以在网络结构定义中我们会看到两个blobs_lr,第一个是weights的,第二个是bias的。类似地,weight_decay也有两个,一个是weight的,一个是bias的);
blob中,mutable_cpu/gpu_data() 和cpu/gpu_data()用来管理memory,cpu/gpu_diff()和 mutable_cpu/gpu_diff()用来计算求导结果。
slover.cpp:
结合loss,用gradient更新weights。主要函数:
Init(),
Solve(),
ComputeUpdateValue(),
Snapshot(), Restore(),//快照(拷贝)与恢复 网络state
Test();
在solver.cpp中有3中solver,即3个类:AdaGradSolver, SGDSolver和NesterovSolver可供选择。
关于loss,可以同时有多个loss,可以加regularization(L1/L2);
Protocol buffer:
上面已经将过, protocol buffer在 .proto文件中定义message类型,.prototxt或.binaryproto文件中定义message的值;
Caffe
Caffe的所有message定义在$CAFFE/src/caffe/proto/caffe.proto中。
Experiment
在实验中,主要用到两个protocol buffer: solver的和model的,分别定义solver参数(学习率啥的)和model结构(网络结构)。
好吧,copy了一大段,不晓得有没有帮助,说点accuracy = 0.5的问题。简单说,就是分错了,好吧我知道这是废话。既然是分错了,那么就要检查下了,首先检查你的训练模型。
根据训练过程来看,训练应该是已经收敛了,(反正loss一直在减小)。
这句可能是我理解问题,如果模型收敛的话,loss应该趋于平稳,如这样。
哦这是对数图。如果没有完全收敛的话,考虑下调整参数吧。说到调参,又是个坑啊。。。这个我也是懵懵懂懂。不过可以参考某些大牛的做法,比如用浅层CNN参数初始化深层CNN,或者学hinton老爷子用DBN来搞个预训练。不过即使是随机初始参数,按道理不应该出现这种accuracy=0.5的情况。个人感觉要么就是训练没有完成,要么就是在做最后二分的那一层有什么问题。。。
其实应该先检查训练数据,训练数据搞混了,其他都是白搭。
如果检查模型,你可以先看下你参数更新的梯度是否已经趋于零了,然后再看看你二分那一层有木有问题。
当然,说了这么多,可能也没啥帮助,如果你哪天改用matlab或者theano了,可以交流下,caffe确实不甚了解。。。
在尝试用caffe分类一个自己的二分类图像数据库。根据训练过程来看,训练应该是已经收敛了,(反正loss一直在减小)。然而测试集上的accuracy一直都是=0.5.
所以现在想着把生成的模型文件调出来用数据测试下,观察下是什么问题,请问应当如何去实现呢。
或者各位如果能指点下,可能是什么原因导致的accuracy = 0.5 不变。那就更好啦。
谢谢!
各种编程语言的深度学习库整理大全!
各种编程语言的深度学习库整理大全!
Python1. Theano是一个python类库,用数组向量来定义和计算数学表达式。它使得在Python环境下编写深度学习算法变得简单。在它基础之上还搭建了许多类库。
1.Keras是一个简洁、高度模块化的神经网络库,它的设计参考了Torch,用Python语言编写,支持调用GPU和CPU优化后的Theano运算。
2.Pylearn2是一个集成大量深度学习常见模型和训练算法的库,如随机梯度下降等。它的功能库都是基于Theano之上。
3.Lasagne是一个搭建和训练神经网络的轻量级封装库,基于Theano。它遵循简洁化、透明化、模块化、实用化和专一化的原则。
4.Blocks也是一个基于Theano的帮助搭建神经网络的框架。
2. Caffe是深度学习的框架,它注重于代码的表达形式、运算速度以及模块化程度。它是由伯克利视觉和学习中心(Berkeley Vision and Learning Center, BVLC)以及社区成员共同开发。谷歌的DeepDream项目就是基于Caffe框架完成。这个框架是使用BSD许可证的C++库,并提供了Python调用接口。
3. nolearn囊括了大量的现有神经网络函数库的封装和抽象接口、大名鼎鼎的Lasagne以及一些机器学习的常用模块。
4. Genism也是一个用Python编写的深度学习小工具,采用高效的算法来处理大规模文本数据。
5. Chainer在深度学习的理论算法和实际应用之间架起一座桥梁。它的特点是强大、灵活、直观,被认为是深度学习的灵活框架。
6. deepnet是基于GPU的深度学习算法函数库,使用Python语言开发,实现了前馈神经网络(FNN)、受限玻尔兹曼机(RBM)、深度信念网络(DBN)、自编码器(AE)、深度玻尔兹曼机(DBM)和卷积神经网络(CNN)等算法。
7. Hebel也是深度学习和神经网络的一个Python库,它通过pyCUDA控制支持CUDA的GPU加速。它实现了最重要的几类神经网络模型,提供了多种激活函数和模型训练方法,例如momentum、Nesterov momentum、dropout、和early stopping等方法。
8. CXXNET是一个基于MShadow开发的快速、简洁的分布式深度学习框架。它是一个轻量级、易扩展的C++/CUDA神经网络工具箱,提供友好的Python/Matlab接口来进行训练和预测。
9. DeepPy是基于NumPy的深度学习框架。
10. DeepLearning是一个用C++和Python共同开发的深度学习函数库。
11. Neon是Nervana System 的深度学习框架,使用Python开发。
Matlab
1. ConvNet 卷积神经网络是一类深度学习分类算法,它可以从原始数据中自主学习有用的特征,通过调节权重值来实现。
2. DeepLearnToolBox是用于深度学习的Matlab/Octave工具箱,它包含深度信念网络(DBN)、栈式自编码器(stacked AE)、卷积神经网络(CNN)等算法。
3. cuda-convet是一套卷积神经网络(CNN)代码,也适用于前馈神经网络,使用C++/CUDA进行运算。它能对任意深度的多层神经网络建模。只要是有向无环图的网络结构都可以。训练过程采用反向传播算法(BP算法)。
4. MatConvNet是一个面向计算机视觉应用的卷积神经网络(CNN)Matlab工具箱。它简单高效,能够运行和学习最先进的机器学习算法。
CPP
1. eblearn是开源的机器学习C++封装库,由Yann LeCun主导的纽约大学机器学习实验室开发。它用基于能量的模型实现卷积神经网络,并提供可视化交互界面(GUI)、示例以及示范教程。
2. SINGA是Apache软件基金会支持的一个项目,它的设计目标是在现有系统上提供通用的分布式模型训练算法。
3. NVIDIA DIGITS是用于开发、训练和可视化深度神经网络的一套新系统。它把深度学习的强大功能用浏览器界面呈现出来,使得数据科学家和研究员可以实时地可视化神经网络行为,快速地设计出最适合数据的深度神经网络。
4. Intel? Deep Learning Framework提供了Intel?平台加速深度卷积神经网络的一个统一平台。
Java
1. N-Dimensional Arrays for Java (ND4J) 是JVM平台的科学计算函数库。它主要用于产品中,也就是说函数的设计需求是运算速度快、存储空间最省。
2. Deeplearning4j 是第一款商业级别的开源分布式深度学习类库,用Java和Scala编写。它的设计目的是为了在商业环境下使用,而不是作为一款研究工具。
3. Encog是一个机器学习的高级框架,涵盖支持向量机、人工神经网络、遗传编程、贝叶斯网络、隐马可夫模型等,也支持遗传算法。
JavaScript
1. Convnet.js 由JavaScript编写,是一个完全在浏览器内完成训练深度学习模型(主要是神经网络)的封装库。不需要其它软件,不需要编译器,不需要安装包,不需要GPU,甚至不费吹灰之力。
Lua
1. Torch是一款广泛适用于各种机器学习算法的科学计算框架。它使用容易,用快速的脚本语言LuaJit开发,底层是C/CUDA实现。Torch基于Lua编程语言。
Julia
1. Mocha是Julia的深度学习框架,受C++框架Caffe的启发。Mocha中通用随机梯度求解程序和通用模块的高效实现,可以用来训练深度/浅层(卷积)神经网络,可以通过(栈式)自编码器配合非监督式预训练(可选)完成。它的优势特性包括模块化结构、提供上层接口,可能还有速度、兼容性等更多特性。
Lisp
1. Lush(Lisp Universal Shell)是一种面向对象的编程语言,面向对大规模数值和图形应用感兴趣的广大研究员、实验员和工程师们。它拥有机器学习的函数库,其中包含丰富的深度学习库。
Haskell
1. DNNGraph是Haskell用于深度神经网络模型生成的领域特定语言(DSL)。
.NET
1. Accord.NET 是完全用C#编写的.NET机器学习框架,包括音频和图像处理的类库。它是产品级的完整框架,用于计算机视觉、计算机音频、信号处理和统计应用领域。
R
1. darch包可以用来生成多层神经网络(深度结构)。训练的方法包括了对比散度的预训练和众所周知的训练算法(如反向传播法或共轭梯度法)的细调。
2. deepnet实现了许多深度学习框架和神经网络算法,包括反向传播(BP)、受限玻尔兹曼机(RBM)、深度信念网络(DBP)、深度自编码器(Deep autoencoder)等等。