chainerの基本的な使い方

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
chainerの基本的な使い方 [2018/02/09 01:46] suikouchainerの基本的な使い方 [Unknown date] (現在) – 削除 - 外部編集 (Unknown date) 127.0.0.1
行 1: 行 1:
-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の基本的な使い方.1518140760.txt.gz
  • 最終更新: 2018/02/09 01:46
  • by suikou