深度学习之tiny-dnn 开源库源码学习(1)

掌管天堂的空之王者,于地域唱响容光之歌,大家好,我是小猪嘎嘎,从今天开始我们来讨论一下深度学习内容。我的计划是写一个系列博客来和大家讨论利用C++的开源库进行deeplearning学习的实验,理论和实验相结合,一方面增强我自己对Deeplearning的理解,另一方面和大家一起交流学习过程中的遇到的问题。这个系列博客以tiny-dnn这个开源库做深度学习为中心,一边讨论tint-dnn源代码,一边学习deeplearning。写这个是受到了"山在岭就在"前辈的系列博客
C++实现卷及神经网络启发,不过我想将我自己的学习过程记录下来,希望有和我类似经历的同学能和我共同交流学习。

首先介绍一下tiny-dnn这个库,详情见github仓库
tiny-dnn on github
这个库当前版本不支持GPU加速,但是支持TBB多线程,更方便的是它是一个仅包含头文件的库,用到了一些C++14的特性,所以如果想用这个库必须使用支持C++14的编译器。如果你想使用该库只需将源代码文件夹放到你的工程目录里即可,不需要编译安装,使用很方便。
tiny-dnn 的作者可谓非常的良心了,不仅源代码注释清楚方便阅读,并且还有简单的入门文档,可能大家没有找到,仓库中有一个文件夹docs是作者写的文档,但是需要编译成可读的文件才能看,如果你不想自己编译,也有在线网站可以阅读
tiny-dnn在线文档
不过这个文档讲的比较简单,仅仅介绍了怎样建立网络训练数据,数据转换等内容。但是对于各个类的具体含义,函数的参数解释都很少,所以这也是我写这系列文章的原因。不要以为作者比较懒文档写的不充分,看了源代码后你就不会这么想了,作者把各个类的说明,函数的解释都放在了源代码中了,并且非常详细。但是读源代码真的是一件比较不容易的事情。
按照我的习惯,读源代码之前一定要先弄明白库的整体结构。然后才能进入局部细节。首先我们看一下官方的例子,从最简单的出发。
按照深度学习的流程走,首先要构建一个我们需要的网络结构,第二整理好训练数据集,第三对数据集进行训练,更新个网络参数,最终完成训练。
DL的流程
第一步构建网络,在tiny-dnn中需要用到network这个模板类,关于这个模板类的详细内容我将会在后面的内容详细介绍,network这个模板类可以实现网络的初始化、添加网络层、训练网络、存储模型、加载模型等接口。其中我觉得最重要的莫非是网络的搭建,这个过程我们需要知道每一层网络的属性,大小和类别。搭建好网络后训练只是时间的事儿了,所以要想训练出一个好的模型,一定要把网络搭建好,然后再找好的数据去训练。

那么到底怎么搭建网络呢?我们不要着急,先回去看一下源代码的框架结构,了解一下源代码的结构更有利于我们理解网络的构建过程。

tiny-dnn 源代码文件夹如下
深度学习之tiny-dnn 开源库源码学习(1)_第1张图片
包括5个文件和9个文件夹(不同的模块), tiny-dnn.h 文件进行了头文件包含和命名空间的设置,在使用该库时只需要包含这个文件即可。config.h是配置文件。我们先不管nodes.h和node.h文件,因为这两个类文件是基础类,我们要寻根溯源,要稍后才能碰到他们。那么最重要的就是network.h这个文件了,这个文件定义了network 模板类,具体的内容大家还是打开这个文件看一下吧。 接下来就是各个模块了,我们首先要关注的是layers模块,这个模块定义了不同类型的layer用于网络的构建。
按照我自己的理解,整体的的结构如下
深度学习之tiny-dnn 开源库源码学习(1)_第2张图片
这是整个的结构,其实看起来一点都不复杂,我们来稍微讲解一下。整个tiny-dnn 库建立在nerwork这个类上,在使用之前要config网络,和整个库。network依赖于layers activation loss-function optimizaters 这几个模块都是深度学习中的重要概念。其他几个我没有列进来是因为他们不和network直接相关,我们后面再介绍。那么整个库的结构就是这个样子的。下面我们要深入进去看一点实在的东西。

接下来我们看一下继承关系。如下图
深度学习之tiny-dnn 开源库源码学习(1)_第3张图片
基类是node类,这是一个抽象类,利用了智能指针的内容,这里我还没有学好,我将在后面的博客中写关于这块的内容。layer类继承了node类,但layer仍然是是一个抽象的不能实例化。图中的input_layer、convolution_layer 等类是可以实例化的都是继承于layer。average_pooling_layer 继承于partial_connected_layer
上面就是layer结构的继承关系。

最后是激活函数的继承关系
深度学习之tiny-dnn 开源库源码学习(1)_第4张图片
activation 类也是继承layer基类。其他激活函数层都继承于activation类。
最后总结一下,我们今天学习了一下tiny-dnn的结构信息,和基本的网络继承关系。

你可能感兴趣的:(C++,Deeplearning)