“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
作者:知乎—石刁柏Asparagus
地址:https://www.zhihu.com/people/ying-yu-fan-yi-raymond
介绍Github上一个日本大神码农写的的深度学习库。
这个repo目前有5千多颗星,被Fork了1千3百次。
如果你想深入了解神经网络的底层,这个tiny-dnn是非常好的选择。因为像TensorFlow这种互联网巨头开发的框架,大部分情况下是直接拿来使用的,不是拿来研究源代码的。深度学习框架的接口越来越友好,很多情况下几行代码就能实现。但是如果你想深入理解深度学习,还是很有必要学习源代码,知其所以然。
为什么推荐这个tiny-dnn?
算例
#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");
}
作者
2016年的时候,作者宣布自己不再维护这个tiny-dnn,想要move on,可能是时间精力不允许了吧。不过从2016年到2018,这个repo上依然有上千条来自网友的commit。
如果你想学习如何用C++写一个深度学习框架,我强烈推荐tiny-dnn。
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。