利来网_利来网博士生开源深度学习C 库DLL:快速构建卷积受限玻尔兹曼机

中国围棋网2017年10月11日 04时10分02秒
62

原标题:资源 | 博士生开源深度学习C 库DLL:快速构建卷积受限玻尔兹曼机

Baptiste Wicht公布了自己编写的深度学习库DLL1.0,可以通过C++接口使用。文中通过几个例子介绍了DLL调用全连接网络、DNN的能力,并通过实验和其它流行框架如TensorFlow、Keras、Torch和Caffe作了综合性能比较。

很高兴公布深度学习库 Deep Learning Library(DLL)1.0 的第一个版本。DLL 是一个神经网络库,致力于提供快速和易用的使用体验。

项目地址:https://github.com/wichtounet/dll

我从四年前为完成 Ph.D. 论文而开始搭建这个库。我需要一个好用的库来训练和使用受限玻尔兹曼机(RBMs),而当时并没有这样的条件。因此,我决定自己编写。现在它能很完美的支持 RBM 和卷积 RBM(CRBM)模型。RBMs(或深度信念网络,DBNs)的堆栈可以用对比分歧(Contrastive Divergence)预训练,然后用 mini-batch 梯度下降或共轭梯度法进行微调,或者直接作为特征提取器。经过多年发展,该库已经扩展到可以处理人工神经网络(ANNs)和卷积神经网络(CNNs)了。其中网络还可以训练常规的自动编码器。还能使用多种高级层比如 Dropout 或 Batch 正则化,以及自适应学习率技术比如 Adadelta 和 Adam。这个库还能集成支持这几个数据集:MNIST,CIFAR-10 和 ImageNet。

这个库可以通过 C++接口使用,完全的仅有标头档(fully header-only),需要 C++14 编译器,即至少需要 clang3.9 或 GCC6.3。

调用案例


我们先看看下面这个使用库的例子:


  • , dll::updater // Nesterov Adam (NADAM)

  • auto net = std::make_unique ();


  • 这个例子是在 MNIST 数据集上训练并测试的简单 3 层全连接神经网络。

    首先,对于头文件(include),你需要包含你将使用的层,在这个例子中只有密集层(dense layer)。然后,你需要包含 network.hpp,这是每一个网络的基本头文件。而且最后的标头就是数据集支持。

    在 main 函数中,首先需要加载全部 MNIST 数据集,然后给出两个选项(该函数有一系列可选的参数)。在这里,我们设置批量大小,并指示每一个样本都必须归一化为平均值为 0,方差为 1。

    之后是很重要的部分,即网络的声明。在 DLL 中,一个网络是一个类型(type)。类型有两个性质,层(layers,包含在 dll::network_layers 中),和选项(options,一系列参数选项),跟随层之后。在这个例子中,我们声明了三个层,第一层有 500 个隐藏单元,第二层有 250 个,而最后一层有 10 个。每一层都有一系列参数选项。最后一层使用 Softmax 激活函数,而不是默认的 Sigmoid 函数。网络本身有 3 个选项。我们将使用 Nesterov Adam(NAdam)优化器,批量大小为 100(必须等于前面数据集提取时声明的批量大小),而在每一个 epoch 之前数据集将被重组(shuffled)。

    然后,我们将简单地使用 std::make_unique 命令创建该网络,在训练集上训练 50 个 epoch,并在测试集上测试。

    以下是该网络的代码:


    首先正如代码中所示,是网络和数据集的展示,然后是网络的训练过程的每一个 epoch 的信息,最后是评估的结果。在大约 2 分半的时间内就能训练一个可以识别 MNIST 数字的网络,而错误率是 2.04%,这个结果不错,但还能继续优化。

    简单介绍一下如何编译。可以直接使用 sudo make install_headers 命令下载 dll 库到你计算机 checked-out dll 文件夹上,然后使用一下命令对文件进行简单的编译:

    clang++ -std=c++14 file.cpp

    或者,如果需要将 dll 复制到本地的 dll 目录中,你需要具体说明头文件的文件夹:

    clang++ -std=c++14 -Idll/include -Idll/etl/lib/include -dll/Ietl/include/ -Idll/mnist/include/ -Idll/cifar-10/include/ file.cpp

    以下几个编译选项可以帮助你提升性能:

    如果想要得到最佳的 CPU 性能,需要用到前面 3 个选项。如果想要得到最佳的 GPU 性能,需要用到后面 3 个选项。由于有些算法并不是完全在 GPU 上计算的,最好使用所有的选项。

    接下来我们重复上述实验,但这次使用的是一个包含两个卷积层和两个池化层的卷积神经网络:


  • , dll::updater // Momentum

  • auto net = std::make_unique ();


  • 比起之前的例子来看并没有太多变化。这个网络起始于一个卷积层,然后是一个池化层,然后又是一个卷积层和池化层,最后是两个全连接层。另一个区别是我们将输入除以 255((dll::scale_pre<255>{}))而不是归一化。最后,我们只训练了 25 个 epoch。

    一旦进行编译和运行,结果将是如下所示的样子:



    这个网络比之前的稍微要好一些,在 3 分钟的时间里达到了 1.52% 的错误率。如果你感兴趣的话,可以在 Github 中找到更多的例子。

    性能

    如果你看过我最新的博客,那么你可能已经看过以下部分信息,但我仍然想在这里强调一下。我在 DLL 库的性能表现上做了大量工作。我决定将 DLL 的性能和流行的框架如 TensorFlow、Keras、Torch 和 Caffe 做个对比。我也试过 DeepLearning4J,但出现了很多问题使我不得不先放弃它。如果有人对其中的结果有兴趣我也可以在某个网站发布。所有的框架都以默认选项安装,并且都可以使用 MKL。

    第一个实验是在 MNIST 数据集上训练一个 3 层网络:


    对于 CPU,DLL 训练这个网络是最快的。比 TensorFlow 和 Keras 快大约 35%,比 Torch 快 4 倍,比 Caffe 快 5 倍。而对于 GPU,Caffe 是最快的,紧接着是 Keras,TensorFlow 和 DLL,而 Torch 是最慢的。

    以下是在同样的任务中使用 CNN 训练的结果:


    再一次,对于 CPU,DLL 是最快的,非常明显,比起 TensorFlow 和 Keras 快 4 倍,比 Torch 和 Caffe 快 5 倍。对于 GPU,DLL 和 TensorFlow 以及 Keras 持平,比 Caffe 快 3 倍,比 Torch 快 5 倍。

    以下是在 CIFAR-10 上用更大的 CNN 训练的结果:


    标签:利来网,利来网官网,利来网娱乐

    本文链接:http://www.weiqi.cc/developer/116643.html 转载请注明出处