MXNet チュートリアル : Python Record IO

MXNet チュートリアル : Python Record IO (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
日時 : 02/21/2017

* 本ページは、MXNet 本家サイトの Python Record IO Tutorial を翻訳した上で適宜、補足説明したものです:
    http://mxnet.io/tutorials/python/record_io.html

Record IO (Advanced) – フリーフォーマット・データをどのように単一の(簡単で効率的な IO のための MXNet の RecordIO フォーマットを使用した)バイナリファイルにパックするか。

 

画像データ I/O で、画像をどのように標準 recordio フォーマットにパックしてそれを ImageRecordIter でロードするかを学習しました。このチュートリアルは record io ファイルを読み書きするための python I/F を walk through します。データパイプラインの詳細に渡り更に制御する必要がある時に有用です。例えば、検出とセグメンテーションのために画像とラベルを増強 (augument) する必要がある時、あるいは triplet sampling と negative sampling のためにデータ iterator をカスタマイズする必要がある時です。

最初の環境セットアップ :

%matplotlib inline
from __future__ import print_function
import mxnet as mx
import numpy as np
import matplotlib.pyplot as plt

関連コードは $mx.recordio$ にあります。2つのクラスがあります : $MxRecordIO$、これはシーケンシャルな読み書きをサポートします、そして $MXIndexedRecordIO$、これはランダム・リードとシーケンシャルな書き込みをサポートします。

 

MXRecordIO

最初に $MXRecordIO を見てみましょう。$tmp.rec$ ファイルをオープンして 5 文字列をそれに書き込みます :

record = mx.recordio.MXRecordIO('tmp.rec', 'w')
for i in range(5):
    record.write('record_%d'%i)
record.close()

そして同じファイルを ‘r’ でオープンすることによりそれを読み戻すことができます :

record = mx.recordio.MXRecordIO('tmp.rec', 'r')
while True:
    item = record.read()
    if not item:
        break
    print (item)
record.close()
record_0
record_1
record_2
record_3
record_4

 

MXIndexedRecordIO

時々より複雑なタスクのためにランダムアクセスが必要でしょう。$MXIndexedRecordIO$ はこのために設計されました。ここで index されたレコード tmp.rec と相当する index ファイル tmp.idx を作成します :

record = mx.recordio.MXIndexedRecordIO('tmp.idx', 'tmp.rec', 'w')
for i in range(5):
    record.write_idx(i, 'record_%d'%i)
record.close()

それからレコードにキーでアクセスできます :

record = mx.recordio.MXIndexedRecordIO('tmp.idx', 'tmp.rec', 'r')
record.read_idx(3)
'record_3'

全てのキーは次のようにリストできます :

record.keys
[0, 1, 2, 3, 4]

 

Packing と Unpacking データ

.rec ファイルの各レコードは任意のバイナリ・データを含むことができますが、機械学習データは典型的にはラベル/データ構造を持ちます。mx.recordio はまたそのようなデータを packing するための2、3のユティリティ関数を含みます、すなわち : $pack$, $unpack$, $pack\_img$, そして $unpack\_img$.

バイナリ・データ

pack と unpack は float (or 1d array of float) ラベルとバイナリ・データをストアするために使用されます :

# pack
data = 'data'
label1 = 1.0
header1 = mx.recordio.IRHeader(flag=0, label=label1, id=1, id2=0)
s1 = mx.recordio.pack(header1, data)
print('float label:', repr(s1))
label2 = [1.0, 2.0, 3.0]
header2 = mx.recordio.IRHeader(flag=0, label=label2, id=2, id2=0)
s2 = mx.recordio.pack(header2, data)
print('array label:', repr(s2))
float label: '\x00\x00\x00\x00\x00\x00\x80?\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00data'
array label: '\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00@\x00\x00@@data'
# unpack
print(*mx.recordio.unpack(s1))
print(*mx.recordio.unpack(s2))
HEADER(flag=0, label=1.0, id=1, id2=0) data
HEADER(flag=3, label=array([ 1.,  2.,  3.], dtype=float32), id=2, id2=0) data

画像データ

pack_img and unpack_img are used for packing image data. Records packed by pack_img can be loaded by mx.io.ImageRecordIter.

# pack_img
data = np.ones((3,3,1), dtype=np.uint8)
label = 1.0
header = mx.recordio.IRHeader(flag=0, label=label, id=0, id2=0)
s = mx.recordio.pack_img(header, data, quality=100, img_fmt='.jpg')
print(repr(s))
'\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xff\xc0\x00\x0b\x08\x00\x03\x00\x03\x01\x01\x11\x00\xff\xc4\x00\x1f\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x91\xa1\x08#B\xb1\xc1\x15R\xd1\xf0$3br\x82\t\n\x16\x17\x18\x19\x1a%&\'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x08\x01\x01\x00\x00?\x00\xfe\x01\xeb\xff\xd9'
# unpack_img
print(*mx.recordio.unpack_img(s))
HEADER(flag=0, label=1.0, id=0, id2=0) [[1 1 1]
 [1 1 1]
 [1 1 1]]

 

Next Step

 

以上