Caffe使用:如何將一維數據或其他非圖像數據轉換成lmdb


  caffe事兒真多,數據必須得lmdb或者leveldb什么的才行,如果數據是圖片的話,那用caffe自帶的convert_image.cpp就行,但如果不是圖片,就得自己寫程序了。我也不是計算機專業的,我哪看得懂源碼,遂奮發而百度之,然無甚結果,遂google之,嘗聞“內事不決問百度,外事不決問google”,古人誠不我欺。在caffe的google group里我找到了這個網址:http://deepdish.io/2015/04/28/creating-lmdb-in-python/

代碼如下:

import numpy as np
import lmdb
import caffe

N = 1000

# Let's pretend this is interesting data
X = np.zeros((N, 3, 32, 32), dtype=np.uint8)
y = np.zeros(N, dtype=np.int64)

# We need to prepare the database for the size. We'll set it 10 times
# greater than what we theoretically need. There is little drawback to
# setting this too big. If you still run into problem after raising
# this, you might want to try saving fewer entries in a single
# transaction.
map_size = X.nbytes * 10

env = lmdb.open('mylmdb', map_size=map_size)

with env.begin(write=True) as txn:
    # txn is a Transaction object
    for i in range(N):
        datum = caffe.proto.caffe_pb2.Datum()
        datum.channels = X.shape[1]
        datum.height = X.shape[2]
        datum.width = X.shape[3]
        datum.data = X[i].tobytes()  # or .tostring() if numpy < 1.9
        datum.label = int(y[i])
        str_id = '{:08}'.format(i)

        # The encode is only essential in Python 3
        txn.put(str_id.encode('ascii'), datum.SerializeToString())

  這是用python將數據轉為lmdb的代碼,但是我用這個處理完數據再使用caffe會出現std::bad_alloc錯誤,后來經過艱苦地奮斗,查閱了大量資料,我發現了問題所在:

  1.caffe的數據格式默認為四維(n_samples, n_channels, height, width) .所以必須把我的數據處理成這種格式

  2.最后一行txn.put(str_id.encode('ascii'), datum.SerializeToString())一定要加上,我一開始一維python2不用寫這個,結果老是出錯,后來才發現這行必須寫!

  3.如果出現mdb_put: MDB_MAP_FULL: Environment mapsize limit reached的錯誤,是因為lmdb默認的map_size比較小,我把lmdb/cffi.py里面的map_size默認值改了一下,改成了1099511627776(也就是1Tb),我也不知道是不是這么改,然后我又把上面python程序里map_size = X.nbytes 這句改成了map_size = X.nbytes * 10,然后就成功了!

 

  找資料的過程中,我還發現了用python寫leveldb的程序,網址在這里:https://github.com/BVLC/caffe/issues/745和http://stackoverflow.com/questions/32707393/whats-caffes-input-format

  用python寫HDF5的程序在這里:http://stackoverflow.com/questions/31774953/test-labels-for-regression-caffe-float-not-allowed/31808324#31808324

 

參考:

  1.http://stackoverflow.com/questions/30983213/how-to-use-1-dim-vector-as-input-for-caffe/30991590#30991590

  2.關於lmdb的map_size大小的問題:https://github.com/BVLC/caffe/issues/1298和http://stackoverflow.com/questions/31820976/lmdb-increase-map-size 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM