深度学习框架:tiny_dnn分析(2) ————分析sample代码

来源:互联网 发布:淘宝网打不开 编辑:程序博客网 时间:2024/06/14 16:33

     之前的博文已经成功编译了最新的tiny_dnn的编译,这里我们从代码入手开始分析一下整个sample代码的一些基本调用情况。

   在分析代码之前我假设大家有基本CNN的了解。这里我们会涉及到的是一个最经典的CNN网络,LeNet-5,这个网络的名气那简直了,几乎搞这行都知道。它的成功运用时在手写字符的识别上的。我直接上图:


    这是网络的结构,这里贴出方便我们下面对照代码。


    我们可以查看到tiny_dnn的名字的工程里的main.cpp.这里找到函数sample_convnet,传入参数data_dir是train-labels.idx1-ubyte,train-images.idx3-ubyte,t10k-labels.idx1-ubyte,t10k-images.idx3-ubyte这4个文件的目录。这4个文件是一个公共的手写体数据集合,4个文件分别是用来做训练的图片,训练用的标签,测试的图片,测试的标签。

    这里构造了一个network的对象,第一层convolutional_layer是图上的C1,一共是6个featruemap,32*32的输入,5*5的卷积核。第二层为图上的S2层,有6个featruemap,这层是pooling层,所以它的输入时28*28,输出时14*14,因为pooling层的原因和上层的featruemap数量也是一致的。下面一层C3的卷积层,大家注意到没有一点和其他卷积层不一样的地方,就是多了一个connection_table,这个是用来做为对上层也就是S2层进行部分的连接。这里也可以试试不用这个table大家测试一下对最后结果有没有影响,本人已经测试过了,没有多大影响,理论上来说也不该有多大影响。下面同样S4是pooling层。值得说的是这里C5之后,代码就直接接的全连接层了,简化了一下原有的LeNet-5。最后输出时10类。也就是0-9,10个数字。

  

   下面就是训练的过程,这里train有几个参数,第一个optimizer参数有一个算法优化器,用来选择做训练时的优化方案,误差传播本身的优化器。第二,三个参数train_images,train_labels是训练的图片和标签,这里是通过train-labels.idx1-ubyte,train-images.idx3-ubyte文件读取的。minibatch_size这个参数就是最小的batch的大小了。on_enumerate_minibatch, on_enumerate_epoch,这两个参数都是和train的时候过程进度输出相关的,用的是类似回调的机制。第5个参数很重要,这是一个训练的循环数,这里我把它改成10了,之前sample是20,纯CPU跑的太慢。

    

最后是test过程,这里没什么可以说的,test_iamges,test_labels是t10k-labels.idx1-ubyte,t10k-images.idx3-ubyte,然后print出来结果,最后用ofstream然后通过network重载的<<保存为"LeNet-weights"文件,这个文件保存了整个网路结构和训练出来的参数结果。

0 0
原创粉丝点击