使用Caffe训练非图像数据

        上一节,我们介绍了使用Caffe训练我们自己的图像用于分类,由于我们有ImageNet的例子,所以一切显得非常自然。那么,如果我们要用裸数据来训练网络(用于分类或者回归),那我们应该怎么做呢?这篇博文进行了详细的介绍。

一、开发环境

        Ubuntu14.04LTS,Python2.7,eclipse

二、数据准备

        数据为著名的安德烈花卉数据集,共有150个样本,python的sklearn包中自带了,我们只需要load_iris()就可以加载数据了。

三、文件说明

        xx_solver.prototxt: 定义了训练网络的结构文件和超参数

        xx_train_test.prototxt:定义了网络的完整结构,data层中include的phase用来区分是训练数据还是测试数据,最后一层为loss层,其它为全连接层。

        xx_deploy.prototxt: 定义了没有数据层(数据层仅定义4D的输入大小)和损失层的网络,在特征提取或预测时使用。

        txt文件中定义了对应的hdf5文件名,hdf5文件为训练过程中生成的数据库文件。

四、代码说明

        python的代码,在这个github地址进行下载,注释详尽,简单明了,可以直接运行。关于代码的详尽注释和分析,也在这篇中文的博客中进行了详解。

        最开始设置网络参数,通过传入prototxt文件名,python调用C++底层进行处理,构建网络模型。然后调用caffe.draw中绘图的函数进行网络的绘制,再调用相应接口将网络每层的权值绘制出来,最后用测试集做测试。

五、网络搭建

        网路结构没有特别的,这里只介绍关键之处,整个由三个全连接层ip1,ip2,ip3组成,每一层采用了relu单元和dropout,这两个都是在2012年的paper中提出的,relu单元的介绍来自Alex关于ImageNet的paper,dropout则是当年早些时候Hinton的一篇paper。

六、实验结果的说明

        在试验中,代码采用了训练集作为测试集,由于数据比较少,这样做必然导致过拟合,如果你细致的观测输出信息,你会发现迭代10000次是完全没有必要的,因为在很早的时候,loss就已经收敛了。当然,这篇博客本来的目的是教我们怎么训练非图像数据,从这点来说必然是没有什么指摘的了。如果你有大量数据,则完全可以区分训练集、交叉检验集和测试集。

        本文只是讲述博主作为一个学习者的观点,如果有不可取之处还请联系博主,如果想了解详细还请跳转至github或者解释代码的博客,链接均在文中给出,祝好!

        See You Next Chapter!

发表评论