**文書の過去の版を表示しています。**
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
画像ファイルを見るため、とりあえず適当なサーバに転送してみる。
!scp layer*.jpg yoshitake.kazutoshi@m208:~/
あとdropoutを行わないと過学習になるようです。たぶん、上記の流れでは過学習のはず。
仮想環境を終わるときはexitして出ていく。
仮想環境を再開したいときは sudo docker start -i yoshitake01
仮想環境を完全に消すときは sudo docker rm yoshitake01
dockerの細かい使い方は別のサイトを参照してください。