前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【他山之石】来自日本程序员的纯C++深度学习库tiny-dnn

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

作者头像
马上科普尚尚
发布2021-01-13 14:23:59
1.3K0
发布2021-01-13 14:23:59
举报

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

作者:知乎—石刁柏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。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能前沿讲习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说了这么多,举个例子:
  • 标题里写到,这个tiny-dnn是一个日本大神码农写的。2015年的时候,他在github上发布了tiny-dnn,这时作者当时写的博客。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档