【他山之石】来自日本程序员的纯C++深度学习库tiny-dnn

2021-01-13 14:23:59 浏览数 (1)

“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。

作者:知乎—石刁柏Asparagus

地址:https://www.zhihu.com/people/ying-yu-fan-yi-raymond

介绍Github上一个日本大神码农写的的深度学习库。

这个repo目前有5千多颗星,被Fork了1千3百次。

如果你想深入了解神经网络的底层,这个tiny-dnn是非常好的选择。因为像TensorFlow这种互联网巨头开发的框架,大部分情况下是直接拿来使用的,不是拿来研究源代码的。深度学习框架的接口越来越友好,很多情况下几行代码就能实现。但是如果你想深入理解深度学习,还是很有必要学习源代码,知其所以然。

为什么推荐这个tiny-dnn?

  • 纯头文件实现(header-only)。换言之,tiny-dnn是纯C 代码,不依赖任何第三方库。你的机器只需要安装C 编译器就可以。
  • 可以训练多层神经网络,即深度学习。这里有个概念需要简要说明。当我们提到深度(deep)学习的时候,一般指的是多层(>2)神经网络,比如卷积神经网络。单层或双层的MLP神经网络一般情况下不称为深度学习,更准确的说法是浅层(shallow)神经网络。训练浅层神经网络其实是比较容易通过代码实现的,也容易收敛。深度学习对算法和代码的要求要高很多。网上有许多纯C 实现的神经网络框架,但只能用来训练浅层神经网络。
  • 可移植。如果你想在自己的C 程序中实现深度学习,又不想去研究TensorFlow的C 接口(官方说明非常不友好),可以把tiny-dnn添加到你的代码里。
  • 代码是根据较新的C 14标准编写的

算例

说了这么多,举个例子:

代码语言:javascript复制
#include "tiny_dnn/tiny_dnn.h"using namespace tiny_dnn;
using namespace tiny_dnn::activation;
using namespace tiny_dnn::layers;

void construct_cnn() {
    using namespace tiny_dnn;

    network<sequential> net;

    // add layers
    net << conv(32, 32, 5, 1, 6) << tanh()  // in:32x32x1, 5x5conv, 6fmaps
        << ave_pool(28, 28, 6, 2) << tanh() // in:28x28x6, 2x2pooling
        << fc(14 * 14 * 6, 120) << tanh()   // in:14x14x6, out:120
        << fc(120, 10);                     // in:120,     out:10

    assert(net.in_data_size() == 32 * 32);
    assert(net.out_data_size() == 10);

    // load MNIST dataset
    std::vector<label_t> train_labels;
    std::vector<vec_t> train_images;

    parse_mnist_labels("train-labels.idx1-ubyte", &train_labels);
    parse_mnist_images("train-images.idx3-ubyte", &train_images, -1.0, 1.0, 2, 2);

    // declare optimization algorithm
    adagrad optimizer;

    // train (50-epoch, 30-minibatch)
    net.train<mse, adagrad>(optimizer, train_images, train_labels, 30, 50);

    // save
    net.save("net");

    // load
    // network<sequential> net2;
    // net2.load("net");
}

作者

标题里写到,这个tiny-dnn是一个日本大神码农写的。2015年的时候,他在github上发布了tiny-dnn,这时作者当时写的博客。

2016年的时候,作者宣布自己不再维护这个tiny-dnn,想要move on,可能是时间精力不允许了吧。不过从2016年到2018,这个repo上依然有上千条来自网友的commit。

如果你想学习如何用C 写一个深度学习框架,我强烈推荐tiny-dnn。

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。

0 人点赞