問題:caffe為什麼採用lmdb,而不是直接讀取原始資料呢?另一方面,lmdb的優勢是具有極高的訪問速度,避免了系統訪問大量小檔案時的io開銷。lmdb使用了記憶體對映的方式訪問檔案,這就使得檔案內定址的開銷大幅度降低。
常用方法:
lmdb_env = lmdb.open(lmdb_file, map_size = int(1e12))建立乙個環境,map_size為建立的資料庫大小
lmdb_txn = lmdb_env.begin(write = true)開啟乙個事務物件,所有的操作都必須經過這個事務物件,其中有乙個引數是write,預設值為false。如果需要寫入操作的話,需要將值改為true。
lmdb_txn.commit()必須使用commit方法提交待處理的事務,不然無法寫入
lmdb_txn.cursor()相當於關聯式資料庫中的游標,每讀取一次,游標下移一位。
lmdb_txn.put(keystr.encode(), datum.serializetostring())將鍵值儲存。注:value必須要序列化成字串。
實現乙個lmdb封裝和打包功能demo:
# -*- coding: utf-8 -*-
# lmdb 資料的封裝和打包
import lmdb
import numpy as np
import caffe
from caffe.proto import caffe_pb2
defwrite()
:# 設定用來存放 lmdb 資料的目錄
lmdb_file =
'lmdb_data'
batch_size =
256# 生成乙個 lmdb 控制代碼 map_size 為 資料庫大小
lmdb_env = lmdb.
open
(lmdb_file, map_size =
int(
1e12))
lmdb_txn = lmdb_env.begin(write =
true
)for x in
range
(batch_size)
:# 生成一些資料
data = np.ones((3
,5,5
), np.uint8)
label = x
# 將 陣列 轉成 datum
datum = caffe.io.array_to_datum(data, label)
keystr ="".
format
(x)# 設定乙個鍵
# 鍵值對 儲存
lmdb_txn.put(keystr.encode(
), datum.serializetostring())
# 一定要提交!!
lmdb_txn.commit(
)def
read()
:
lmdb_env = lmdb.
open
('lmdb_data'
) lmdb_txt = lmdb_env.begin(
)# caffe中經常採用datum這種資料結構儲存資料,
datum = caffe_pb2.datum(
)for key, value in lmdb_txt.cursor():
# 因為儲存的時候進行了序列化,現在需要反序列化
datum.parsefromstring(value)
label = datum.label
# 將 value 轉化為 陣列
data = caffe.io.datum_to_array(datum)
print
(label)
print
(data)
if __name__ ==
'__main__'
: write(
) read(
)
使用caffe製作自己的lmdb資料集
新鳥最近在一家半導體公司實習,接觸到的專案都是基於 caffe框架的深度學習方面的知識,前期對tensorflow比較熟,但是到了公司沒辦法啊!不會怎麼辦,只能硬著頭皮上啊!中途碰壁不少,寫這篇部落格只是想以後方便查閱資料,另外一方面是給同樣在深度學習裡面摸爬滾打的朋友乙個參考吧!公司提供的資料都是...
封裝自己的pytorch資料集
1.pytorch 對於資料的標籤要求是長整形,因此要對標籤進行轉換 train label train label.long 2.對於資料的特徵部分,要轉換為tensor 形式,可以通過torch.tensor 將資料從numpy 轉為tensor train fea torch.tensor t...
生成caffe所用的lmdb資料
本文只介紹在caffe框架下生成lmdb格式的資料,因為在caffe框架下訓練和測試都只能用lmdb格式的資料 準備 1 ubuntu 18.04 2 新建data資料夾,內含train和test兩個資料夾 3 train資料夾和test資料夾裡面分別含img和xml兩個資料夾,裡面分別是原影象 j...