2015-10-19 64 views
0

由於某些原因,HDF5的培訓在第一次開始時總會失敗,測試和列車損失可能很快會降至接近於零,因此我很難在HDF5上處理圖像分類和迴歸任務。在嘗試了所有的技巧之後,例如降低學習速度,添加RELU,退出,沒有任何東西開始工作,所以我開始懷疑我給caffe餵食的HDF5數據是錯誤的。如何向caffe或現有示例向HDF5提供圖像數據?

所以我目前正在處理通用數據集(Oxford 102 category flower dataset,它也有public code),首先我通過嘗試ImageData和LMDB層來進行分類,他們都工作得很好。最後,我使用HDF5數據層進行微調,除非使用HDF5的數據層,否則training_prototxt不會改變。再次,在學習開始時,在第60次迭代時,損失從5下降到0.14,在迭代100時損失從0.00146下降,這似乎證明HDF5數據是不正確的。

我有兩個圖像&標籤上github,他們都似乎產生了HDF5數據集,但由於某些原因,這些數據集似乎並不HDF5片段將不會與朱古力工作

不知什麼這個數據是錯誤的,或者是讓這個例子在HDF5中運行的任何東西,或者你有一些HDF5的例子用於分類或迴歸,這對我很有幫助。

一個片段顯示,似乎在原有淨的情況發生,並從你的HDF5創作丟失意味着減法作爲

def generateHDF5FromText2(label_num): 
    print '\nplease wait...' 

    HDF5_FILE = ['hdf5_train.h5', 'hdf5_test1.h5'] 
     #store the training and testing data path and labels 
    LIST_FILE = ['train.txt','test.txt'] 
    for kk, list_file in enumerate(LIST_FILE): 

    #reading the training.txt or testing.txt to extract the all the image path and labels, store into the array 
    path_list = [] 
    label_list = [] 
    with open(list_file, buffering=1) as hosts_file: 
     for line in hosts_file: 
      line = line.rstrip() 
      array = line.split(' ') 
      lab = int(array[1]) 
      label_list.append(lab) 
      path_list.append(array[0]) 

     print len(path_list), len(label_list) 

       # init the temp data and labels storage for HDF5 
     datas = np.zeros((len(path_list),3,227,227),dtype='f4') 
     labels = np.zeros((len(path_list), 1),dtype="f4") 

     for ii, _file in enumerate(path_list): 
        # feed the image and label data to the TEMP data 
      img = caffe.io.load_image(_file) 
      img = caffe.io.resize(img, (227, 227, 3)) # resize to fixed size 
      img = np.transpose(img , (2,0,1)) 
      datas[ii] = img 
      labels[ii] = int(label_list[ii]) 

      # store the temp data and label into the HDF5 
     with h5py.File("/data2/"+HDF5_FILE[kk], 'w') as f: 
      f['data'] = datas 
      f['label'] = labels 
      f.close() 
+0

您正在研究RGB圖像*而沒有任何轉換(例如,RGB-> BGR,平均減法等),可能是您的訓練模型使用某些轉換進行了訓練。 – Shai

+0

調試這種方法的一種方法是拍攝'X'圖像,將它們轉換爲'lmdb'並將它們存儲到HDF5。建立一個具有兩個輸入層的網絡:一個讀取lmdb,另一個讀取HDF5。然後添加一個比較兩個輸入圖像的「EucleadeanLoss」圖層。這應該表明兩個圖像是否相同。可能是 – Shai

+0

。我將如何做Caffe HDF5 Layer中的減法,在LMDB層中,我可以在prototxt中配置'transform_param> mean_file'。 – user824624

回答

2

一個輸入變換。
您應該獲得平均文件(在您的示例中看起來像"imagenet_mean.binaryproto"),將其讀入python並從每張圖像中減去它。

順便說一句,平均文件可以爲您提供關於輸入圖像的比例(如果像素值應該在[0..1]範圍或[0..255])的線索。

你可能會發現caffe.io有用的轉換binaryproto到numpy數組。

相關問題