Pylearn2で学習したモデルとテストデータを使って検証を行う方法を説明します。
テストデータを読み込む
テストデータはpylearn2.datasetsモジュールから読み込む方法と、pklファイルを読み込む方法があります。
読み込んだあと、入力値はdata.X, 出力値はdata.yで参照できます。
pylearn2.datasetsモジュールからMNISTデータセットを読み込む場合:
from pylearn2.datasets import mnist
data = mnist.MNIST(which_set="train")
pklファイルを読み込む場合:
import pickle
data = pickle.load(open("path/to/test_dataset.pkl"))
モデルを読み込む
学習後のモデルはpklファイルになっており、それを読み込めばよいです。
import pickle
model= pickle.load(open("path/to/model.pkl"))
予測値を計算する
予測値を計算する関数を作ります。
モデルのfpropメソッドを使ってtheano関数を生成し、その関数に入力値を渡すことで予測値を得ることができます。
ただしfpropの入力とデータセットの入力とで空間が異なることがあるので、Space#format_asを使って変換を行います。
生成した関数は複数の入力値に対する予測値を一度に計算することができます。
予測値を複数回に分けて計算していますが、これは1度に計算するとメモリ不足になることがあるためです。
以下の関数ではinputsにデータセットのX、modelにモデルをとります。
import theano
from pylearn2.space import VectorSpace
...
def simulate(inputs, model):
space = VectorSpace(inputs.shape[1])
X = space.get_theano_batch()
Y = model.fprop(space.format_as(X, model.get_input_space()))
f = theano.function([X], Y)
result = []
batch_size = 100
for x in xrange(0, len(inputs), batch_size):
result.extend(f(inputs[x:x + batch_size]))
return result
結果を集計する
統計分類の場合は以下のようにして集計することができます。
以下の関数のoutputsにはsimulateの戻り値、labelsにはデータセットのyを渡します。
numpyのargmaxを使って出力が最大となる要素を求め、データセットのyと比較します。
import numpy as np
...
def count_correct(outputs, labels):
correct = 0;
for output, label in zip(outputs, labels):
if np.argmax(output) == label:
correct += 1
return correct
使用例
MNISTデータセットを使う場合の例を示します。
import pickle
from pylearn2.datasets import mnist
model = pickle.load(open("path/to/model.pkl"))
data = mnist.MNIST(which_set="test")
predicts = simulate(data.X, model)
correct = count_correct(predicts, data.y)
print "{} / {}".format(correct, len(data.X))
参考文献