本記事では、Python初心者のためにCIFAR-10データのファイル入力について解説します。
CIFAR-10というのは、一般物体認識のベンチマーク用画像データセットです。
http://www.cs.toronto.edu/~kriz/cifar.html

本記事を書くきっかけとなったのは、以下の記事を参考にChainerでCNNを試したことです。
実行はうまくいったのですが、Python初心者なので、CIFAR-10のファイル入力の理解に手間取りました。
ChainerによるCIFAR-10の一般物体認識 (1)

まずは、ソースコードを載せます。
このソースコードは上記サイトと以下のサイトのコードを合体して、改変したものです。
http://aidiary.hatenablog.com/entry/20151014/1444827123
#coding: utf-8
import numpy as np
import matplotlib.pyplot as plt

def unpickle(f):
import cPickle
fo = open(f, 'rb')
d = cPickle.load(fo)
fo.close()
return d

def load_cifar10(datadir):
train_data = []
train_target = []

# 訓練データをロード
for i in range(1, 6):
d = unpickle("%s/data_batch_%d" % (datadir, i))
train_data.extend(d["data"])
train_target.extend(d["labels"])

# テストデータをロード
d = unpickle("%s/test_batch" % (datadir))
test_data = d["data"]
test_target = d["labels"]

# データはfloat32、ラベルはint32のndarrayに変換
train_data = np.array(train_data, dtype=np.float32)
train_target = np.array(train_target, dtype=np.int32)
test_data = np.array(test_data, dtype=np.float32)
test_target = np.array(test_target, dtype=np.int32)

# 画像のピクセル値を0-1に正規化
train_data /= 255.0
test_data /= 255.0

return train_data, test_data, train_target, test_target

# CIFAR-10データをロード
print "load CIFAR-10 dataset"
X_train, X_test, y_train, y_test = load_cifar10("data")

# 画像を (nsample, channel, height, width) の4次元テンソルに変換
X_train = X_train.reshape((len(X_train), 3, 32, 32))
X_test = X_test.reshape((len(X_test), 3, 32, 32))

# 画像を表示
plt.imshow(X_train[0].reshape(3, 32, 32).transpose(1, 2, 0))
plt.show()
では、解説していきます。
def unpickle(f):
import cPickle
fo = open(f, 'rb')
d = cPickle.load(fo)
fo.close()
return d
ここでは、PythonのcPickleを利用しています。
cPickleはPythonオブジェクトとバイト列との相互変換を行うライブラリです。
この例では、load()によってファイル入力を行い、Pythonのdict型オブジェクトであるdを生成しています。
dict型オブジェクトは、以下のサイトに記されているように、キーと値が紐づけられたオブジェクトです。
http://www.pythonweb.jp/tutorial/dictionary/index8.html

# 訓練データをロード
for i in range(1, 6):
d = unpickle("%s/data_batch_%d" % (datadir, i))
train_data.extend(d["data"])
train_target.extend(d["labels"])
6個のファイルに分かれた訓練データをロードします。
"%s/data_batch_%d" % (datadir, i)は、%sにdatadir、%dにiを代入して、ファイル名文字列となります。
このファイル名のファイルからデータをロードし、train_dataとtrain_targetに追加していきます。
d["key"]はdict型オブジェクトdから"key"という名前のキーに紐づけられた値を参照します。
"data"キーは画像データ、"labels"キーは正解ラベルの値と紐づけられています。

# 画像を (nsample, channel, height, width) の4次元テンソルに変換
X_train = X_train.reshape((len(X_train), 3, 32, 32))
X_test = X_test.reshape((len(X_test), 3, 32, 32))
データをChainerのデータ形式(画像数, チャンネル数, 高さ, 幅)に変換します。

以上です。