ChainerのCNNにおけるデータセットの作り方

Chainerとは

前回も少し触れたが、Chainerとは、python向けの深層学習、ディープラーニング用のフレームワークです。インストールすることで、誰でも気軽にデータさえ用意すれば深層学習のプログラムを走らせることが可能です。インストール時には同時にchainerのサンプルプログラムもダウンロードされるので、それを見ながら理解を深めていくといいだろう。

データセットについて


Chainerでディープラーニングを行うには、学習用のネットワークと呼ばれるモデルを作成し、そこに集めたデータを入力する必要があります。サンプルプログラムでは、サンプルデータをネット上からダウンロードしてそのままデータセットの何らかの関数にセットしているため、データそのものはPC上に見える形で残りません。よって、自分の好きなデータを入力とするときは少し書き換える必要が出てきます。
Chainerのminetサンプルを見てみましょう。ネット上からデータを取ってきている部分をまずはコメント文にしておきます。
・mnistのサンプルより抜粋

    #train, test = chainer.datasets.get_mnist(ndim=3)

自分のデータをデータセットにする

続いて、実際の自分のデータをデータセットにする方法を説明します。CNNの場合、サンプルデータとして用意するのは画像データです。この時、画像データが大きすぎると処理落ち?してしまうようなので、大きすぎる場合はリサイズをしてからにするといいでしょう。私の場合は、128×128でいけました。
Chainerで画像をデータセットにする場合、3色のRGBカラー画像データだと少しまえ処理が必要になります。普通[[R,G,B][R,G,B]….[R,G,B]]といった感じで並んでいる画素データを、[[R,R,R,….][G,G,G,….][B,B,B,….]]という形に並べかえる必要があります。その部分のプログラムを以下に示します。

    pathsAndLabels = []
    pathsAndLabels.append(np.asarray(["/Desktop/image1/", 0]))
    pathsAndLabels.append(np.asarray(["/Desktop/image2/", 1]))

    allData = []
    for pathAndLabel in pathsAndLabels:
        path = pathAndLabel[0]
        label = pathAndLabel[1]
        imagelist = glob.glob(path + "*")
        for imgName in imagelist:
            allData.append([imgName, label])
    allData = np.random.permutation(allData)

    imageData = []
    labelData = []
    for pathAndLabel in allData:
        img = Image.open(pathAndLabel[0])
        #3チャンネルの画像をr,g,bそれぞれの画像に分ける
        r,g,b= img.split()
        rImgData = np.asarray(np.float32(r)/255.0)
        gImgData = np.asarray(np.float32(g)/255.0)
        bImgData = np.asarray(np.float32(b)/255.0)
        imgData = np.asarray([rImgData, gImgData, bImgData])
        imageData.append(imgData)
        labelData.append(np.int32(pathAndLabel[1]))

画像データは上記のpathsAndLabelsの配列に格納されているパスのフォルダの中に入れておきます。2つ目の0と1の変数は学習を行うときに必要なラベルで、分類数が増えたときは2,3…と増やしていくと良いです。

また、np.random.permutation(allData)の部分でデータをシャッフルしてあるので、トレーニングデータとテストデータに分ける際にその選択ファイルはランダムとなります。


ここで生成された画像データが格納された配列を、タプルと呼ばれるChainerの関数に入れることでデータセットの作成は完了です。今回はデータをトレーニング用とテスト用に分けてあり、全体の7/8を学習用、残りをテスト用として、trainとtestに格納しています。実際に学習を行うときは、このデータをイテレーターにセットする必要があります。

    threshold = np.int32(len(imageData)/8*7)
    train = tuple_dataset.TupleDataset(imageData[0:threshold], labelData[0:threshold])
    test  = tuple_dataset.TupleDataset(imageData[threshold:],  labelData[threshold:])

    train_iter = chainer.iterators.SerialIterator(train, batch_size=100)
    test_iter = chainer.iterators.SerialIterator(test, batch_size=100, repeat=False, shuffle=False)

まとめ

いかがだっただろうか、自分のデータを実際にデータセットとしてプログラムに組み込むことができれば、あとは実際に学習ループを回してモデルを生成するのみです。とはいえサンプルプログラムは所々不親切な気がします。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

ChainerのCNNにおけるデータセットの作り方」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です