“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
作者:知乎—石刁柏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。
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。