圖片數據集持久化保存(序列化)

前言

一般我們訓練模型都無法一次就得到滿意的結果,需要重複的調參訓練。這樣就會導致每次都需要重新加載圖片然後轉化爲numpy數組,難道就不能一次加載之後保存成一個文件,然後下次就不用在去加載圖片,這樣會不會節省一點時間。

pickle

python自帶了一個數據持久化的工具pickle,先試試效果怎麼樣:

import pickle

# data爲已經加載的numpy數組
with open('data.pkl','wb') as f:
	pickle.dump(data, f)

十萬張驗證碼用時125s,不過這個時間不重要,因爲只是一次保存,我們在意的是加載的時間。但是保存的data.pkl居然有2.6G,我的驗證碼加起來也才700M,這也太離譜了。試一下加載:

import pickle
with open('F:/X.pkl', 'rb') as f:
    data = pickle.load(f)
print(data.shape)

用時10.9s,這速度還行,因爲如果直接加載圖片的話用時大概一分鐘,這差距還是挺大的。如果體積能減小的話就完美了。

hickle

簡介:基於hdf5的序列化的python實現
github地址:https://github.com/telegraphic/hickle
保存:(用時大概180s,大小爲1.09G)

import hickle

hickle.dump(data, 'data.hkl', mode='w', compression='gzip')

加載:

import hickle
data = hickle.load('data.hkl')

在使用上很人性化,和pickle的接口一樣。加載的話用時30s,有點慢,但是保存的文件大小和pickle對比起來感覺好多了。

pytables

簡介:基於hdf5的序列化的python實現,專門序列化numpy數組的工具
github地址:https://github.com/PyTables/PyTables
保存:

import tables


hdf5_file = tables.open_file("data.hdf5", mode='w')
filters = tables.Filters(complevel=5, complib='blosc')
earray = hdf5_file.create_earray(
    hdf5_file.root,
    'data', # 數據鍵值,加載時需要
    tables.Atom.from_dtype(X.dtype), # 數據類型
    shape=(0, 60, 150, 3), # 數據維度,需要有一個方向的維度爲0,表示這個方向可以擴展數據
    filters=filters,
    expectedrows=1000000000   # 數據估算大小
)

earray.append(X)
hdf5_file.close()

耗時80s,大小爲987M。序列化的時間和大小都是很不錯的,看看加載速度:

import tables
hdf5_file = tables.open_file("data.hdf5", mode='r')
hdf5_data = hdf5_file.root.data  # 數據鍵值
print(hdf5_data.shape) 
hdf5_file.close()

這個速度不可思議,10ms左右,感覺他並沒有實際加載數據。但是我試了一下取某一段的值,比如data[-10:-9]也是差不多的速度。這工具我愛了。

Bloscpack

簡介:序列化命令行工具,有python接口
guthub地址:https://github.com/Blosc/bloscpack
保存:

import bloscpack as bp
bp.pack_ndarray_to_file(X, 'data.blp')
#bp.pack_ndarray_to_file(X, 'data.blp', blosc_args=bp.args.BloscArgs(clevel=9, cname='lz4'))

用時73s,大小爲847M,加了blosc_args參數大小還變大了幾十M。
加載:

import bloscpack as bp
data = bp.unpack_ndarray_from_file('data.blp')
print(data.shape)

用時3秒,很不錯的表現,所以我用pytables。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章