chainerの基本的な使い方

Deep Learningに必須なGPUは今のところm208にしか設置されていないので、まずはm208にログインする。

下記のコマンドでCUDAなどがインストールされた仮想環境を起動

sudo nvidia-docker run --name yoshitake01 -it chainer/chainer /bin/bash

(yoshitake01のところは適当な名前に変える)

この仮想環境はubuntuなので、aptで適当なパッケージをインストール可能。仮想環境なのでapt使っても問題なし。(でもdockerによる仮想化はroot権限を使うので、仮想環境起動時に別のオプションをつけると色々問題が出たりもするので注意。)

例:

apt-get update
apt-get install ssh

pipも使って足りないpythonのパッケージもインストールしてみましょう。

pip install --upgrade pip
pip install ipython
pip install Image

ipythonを使うとtabを押すことで変数や関数の補完が出来ますし、!のあとにLinuxのコマンドを入力することもできます。

例:ipythonを実行した後、!(cat /etc/bash.bashrc|grep sudo)のようなコマンドを実行可能。 Rもこのくらい簡単に外部コマンドが呼び出せると良いのに…

まずはCPUだけを使った文字認識の例は https://ai-kenkyujo.com/2017/09/18/chainer-deeplearning/ を参考に

# CPU version
# Numpy
import numpy as np
# Chainer
import chainer
import chainer.links as L
import chainer.functions as F
from chainer import Chain, optimizers, Variable

train, test = chainer.datasets.get_mnist()

x_train = []
x_test = []
t_train = []
t_test = []

for line in train:
    x_train.append(line[0])
    t_train.append(int(line[-1]))

for line in test:
    x_test.append(line[0])
    t_test.append(int(line[-1]))

x_train = np.array(x_train, dtype=np.float32)
x_test = np.array(x_test, dtype=np.float32)
t_train = np.array(t_train, dtype=np.int32)
t_test = np.array(t_test, dtype=np.int32)

# DNNのクラス
class DNN(Chain):
    def __init__(self):
        super(DNN, self).__init__(
            l1 = L.Linear(784, 100),
            l2 = L.Linear(100, 100),
            l3 = L.Linear(100, 10)
        )
    def forward(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        h3 = self.l3(h2)
        return h3

# DNNクラスのインスタンス
model = DNN()

# 最適化手法
optimizer = optimizers.Adam()
optimizer.setup(model)

# エポック数
n_epoch = 10

# バッチサイズ
batch_size = 1000

# 学習実行
for epoch in range(n_epoch):
    sum_loss = 0
    perm = np.random.permutation(60000)
    for i in range(0, 60000, batch_size):
        x = Variable(x_train[perm[i:i+batch_size]])
        t = Variable(t_train[perm[i:i+batch_size]])
        y = model.forward(x)
        model.cleargrads()
        loss = F.softmax_cross_entropy(y, t)
        loss.backward()
        optimizer.update()
        sum_loss += loss.data*batch_size

    print("epoch: {}, mean loss: {}".format(epoch, sum_loss/60000))

# テスト実行
cnt = 0
for i in range(10000):
    x = Variable(np.array([x_test[i]], dtype=np.float32))
    t = t_test[i]
    y = model.forward(x)
    y = np.argmax(y.data[0])
    if t == y:
        cnt += 1

# 正解数と正解率を表示
print(cnt)
print("accuracy: {}".format(cnt/(10000.0)))

GPUを使う場合は、いくつか変更して次のような感じ

#GPU version
# Numpy
import numpy as np
# Chainer
import chainer
import chainer.links as L
import chainer.functions as F
from chainer import Chain, optimizers, Variable, cuda

train, test = chainer.datasets.get_mnist()

x_train = []
x_test = []
t_train = []
t_test = []

xp = cuda.cupy

for line in train:
    x_train.append(line[0])
    t_train.append(int(line[-1]))

for line in test:
    x_test.append(line[0])
    t_test.append(int(line[-1]))

x_train = xp.array(x_train, dtype=xp.float32)
x_test = xp.array(x_test, dtype=xp.float32)
t_train = xp.array(t_train, dtype=xp.int32)
t_test = xp.array(t_test, dtype=xp.int32)

# DNNのクラス
class DNN(Chain):
    def __init__(self):
        super(DNN, self).__init__(
            l1 = L.Linear(784, 100),
            l2 = L.Linear(100, 100),
            l3 = L.Linear(100, 10)
        )
    def forward(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        h3 = self.l3(h2)
        return h3

# DNNクラスのインスタンス
model = DNN()

gpu_device = 0
cuda.get_device(gpu_device).use()
model.to_gpu(gpu_device)

# 最適化手法
optimizer = optimizers.Adam()
optimizer.setup(model)

# エポック数
n_epoch = 10

# バッチサイズ
batch_size = 1000

# 学習実行
for epoch in range(n_epoch):
    sum_loss = 0
    perm = np.random.permutation(60000)
    for i in range(0, 60000, batch_size):
        x = Variable(x_train[perm[i:i+batch_size]])
        t = Variable(t_train[perm[i:i+batch_size]])
        y = model.forward(x)
        model.cleargrads()
        loss = F.softmax_cross_entropy(y, t)
        loss.backward()
        optimizer.update()
        sum_loss += loss.data*batch_size

    print("epoch: {}, mean loss: {}".format(epoch, sum_loss/60000))

# テスト実行
cnt = 0
for i in range(1000): #遅いのでCPUより1桁少なくした
    x = Variable(xp.array([x_test[i]], dtype=xp.float32))
    t = t_test[i]
    y = model.forward(x)
    y = xp.argmax(y.data[0])
    if t == y:
        cnt += 1

# 正解数と正解率を表示
print(cnt)
print("accuracy: {}".format(cnt/(1000.0)))

中間層の可視化は例えば次のようにやってみる。

from PIL import Image
#1層目
n=0
for x in model.l1.W.data:
    img2 = Image.new('RGB', (28, 28))
    for i in range(28):
        for j in range(28):
            val=int(x[i*28+j]/x.max()*255)
            img2.putpixel((i,j),(val,val,val))
    img2.save('layer1_'+str(n)+'.jpg')
    n+=1

#2層目
n=0
for x in model.l2.W.data:
    img2 = Image.new('RGB', (10, 10))
    for i in range(10):
        for j in range(10):
            val=int(x[i*10+j]/x.max()*255)
            img2.putpixel((i,j),(val,val,val))
    img2.save('layer2_'+str(n)+'.jpg')
    n+=1

#3層目
n=0
for x in model.l3.W.data:
    img2 = Image.new('RGB', (10, 10))
    for i in range(10):
        for j in range(10):
            val=int(x[i*10+j]/x.max()*255)
            img2.putpixel((i,j),(val,val,val))
    img2.save('layer3_'+str(n)+'.jpg')
    n+=1

あと本来はdropoutを行わないと過学習になるようです。

仮想環境を終わるときはexitして出ていく。

仮想環境を再開したいときは sudo docker start -i yoshitake01

仮想環境を完全に消すときは sudo docker rm yoshitake01

dockerの細かい使い方は別のサイトを参照してください。

  • chainerの基本的な使い方.1518140662.txt.gz
  • 最終更新: 2018/02/09 01:44
  • by suikou