決定將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我第三次看,還是白板一樣,全是新知識撲面而來。