caffe的输入
决定将caffe分为几个部分进行总结,首先是第一部分,输入数据以及输入层。
首先从输入数据对BP的影响开始介绍。
sgd的随机性
由于是sgd,因此样本一定要shuffle。BP中说到,样本选择遵循俩个原则:1.shuffle,让样本囊括所有类,2. 使得误差大的样本多出现,而误差小的少出现。
首先说一说第一个:
随机性,这个在caffe中都是怎么体现的呢?先说说caffe中的输入格式吧,leveldb, image原始数据,hdf5,lmdb。其中对应的类有data_layer, image_data_layer,windows_data_layer,hdf5_data_layer。使用leveldb作为输入的层,在打leveldb时已经shuffle过了,一定要选择要随机打leveldb,否则模型无法训练的。而用image原始数据作为输入的层,在读入数据列表后,image_Data_layer会先进行整体shuffle,然后再进行训练。而window_data_layer,首先读取数据列表,然后在训练过程中,读取数据时,每次读的数据时随机的。而hdf5和lmdb,我没有打过hdf5,lmdb,等我调查后再补充,从代码来看,应该在打hdf5时就要随机的。
第二点呢,这个其实在caffe里我没有看到相关的应用,我想可能主要是因为caffe主要是针对大数据训练的(咳咳,现在说到大数据我就别扭,连什么什么会都开始什么都冠名“大”了,太俗了)。在这种情况下,想要记录每一个训练样本的误差,是基本上无法实现的,而且当数据量大了,也不需要去在乎这个了。但是,这个训练策略是值得一提的,在SVM的训练中,用到的是hard negative minning,就是这个原理,或者差不多吧。在SVM的训练过程中,每次都是选择那些分错的从新训练,而分对的不需要再进行。具体理论保证,我好想又忘记了……
本小题未完待续,最近系统看关于fp,bp的文章,efficient bp我第三次看,还是白板一样,全是新知识扑面而来。