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

     之前的博文已经成功编译了最新的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"文件,这个文件保存了整个网路结构和训练出来的参数结果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值