差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン | ||
chainerの基本的な使い方 [2018/02/09 01:44] – 作成 suikou | chainerの基本的な使い方 [Unknown date] (現在) – 削除 - 外部編集 (Unknown date) 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
- | Deep Learningに必須なGPUは今のところm208にしか設置されていないので、まずはm208にログインする。 | ||
- | 下記のコマンドでCUDAなどがインストールされた仮想環境を起動 | ||
- | ``` | ||
- | sudo nvidia-docker run --name yoshitake01 -it chainer/ | ||
- | ``` | ||
- | (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 / | ||
- | |||
- | まずはCPUだけを使った文字認識の例は | ||
- | https:// | ||
- | を参考に | ||
- | |||
- | ``` | ||
- | # 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, | ||
- | x_test = np.array(x_test, | ||
- | t_train = np.array(t_train, | ||
- | t_test = np.array(t_test, | ||
- | |||
- | # DNNのクラス | ||
- | class DNN(Chain): | ||
- | def __init__(self): | ||
- | super(DNN, self).__init__( | ||
- | l1 = L.Linear(784, | ||
- | l2 = L.Linear(100, | ||
- | l3 = L.Linear(100, | ||
- | ) | ||
- | def forward(self, | ||
- | 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: | ||
- | t = Variable(t_train[perm[i: | ||
- | y = model.forward(x) | ||
- | model.cleargrads() | ||
- | loss = F.softmax_cross_entropy(y, | ||
- | loss.backward() | ||
- | optimizer.update() | ||
- | sum_loss += loss.data*batch_size | ||
- | |||
- | print(" | ||
- | |||
- | # テスト実行 | ||
- | cnt = 0 | ||
- | for i in range(10000): | ||
- | x = Variable(np.array([x_test[i]], | ||
- | t = t_test[i] | ||
- | y = model.forward(x) | ||
- | y = np.argmax(y.data[0]) | ||
- | if t == y: | ||
- | cnt += 1 | ||
- | |||
- | # 正解数と正解率を表示 | ||
- | print(cnt) | ||
- | print(" | ||
- | ``` | ||
- | |||
- | 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, | ||
- | x_test = xp.array(x_test, | ||
- | t_train = xp.array(t_train, | ||
- | t_test = xp.array(t_test, | ||
- | |||
- | # DNNのクラス | ||
- | class DNN(Chain): | ||
- | def __init__(self): | ||
- | super(DNN, self).__init__( | ||
- | l1 = L.Linear(784, | ||
- | l2 = L.Linear(100, | ||
- | l3 = L.Linear(100, | ||
- | ) | ||
- | def forward(self, | ||
- | 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: | ||
- | t = Variable(t_train[perm[i: | ||
- | y = model.forward(x) | ||
- | model.cleargrads() | ||
- | loss = F.softmax_cross_entropy(y, | ||
- | loss.backward() | ||
- | optimizer.update() | ||
- | sum_loss += loss.data*batch_size | ||
- | |||
- | print(" | ||
- | |||
- | # テスト実行 | ||
- | cnt = 0 | ||
- | for i in range(1000): | ||
- | x = Variable(xp.array([x_test[i]], | ||
- | t = t_test[i] | ||
- | y = model.forward(x) | ||
- | y = xp.argmax(y.data[0]) | ||
- | if t == y: | ||
- | cnt += 1 | ||
- | |||
- | # 正解数と正解率を表示 | ||
- | print(cnt) | ||
- | print(" | ||
- | ``` | ||
- | |||
- | 中間層の可視化は例えば次のようにやってみる。 | ||
- | |||
- | ``` | ||
- | from PIL import Image | ||
- | #1層目 | ||
- | n=0 | ||
- | for x in model.l1.W.data: | ||
- | img2 = Image.new(' | ||
- | for i in range(28): | ||
- | for j in range(28): | ||
- | val=int(x[i*28+j]/ | ||
- | img2.putpixel((i, | ||
- | img2.save(' | ||
- | n+=1 | ||
- | |||
- | #2層目 | ||
- | n=0 | ||
- | for x in model.l2.W.data: | ||
- | img2 = Image.new(' | ||
- | for i in range(10): | ||
- | for j in range(10): | ||
- | val=int(x[i*10+j]/ | ||
- | img2.putpixel((i, | ||
- | img2.save(' | ||
- | n+=1 | ||
- | |||
- | #3層目 | ||
- | n=0 | ||
- | for x in model.l3.W.data: | ||
- | img2 = Image.new(' | ||
- | for i in range(10): | ||
- | for j in range(10): | ||
- | val=int(x[i*10+j]/ | ||
- | img2.putpixel((i, | ||
- | img2.save(' | ||
- | n+=1 | ||
- | ``` | ||
- | |||
- | あと本来はdropoutを行わないと過学習になるようです。 | ||
- | |||
- | 仮想環境を終わるときはexitして出ていく。 | ||
- | |||
- | 仮想環境を再開したいときは | ||
- | sudo docker start -i yoshitake01 | ||
- | |||
- | 仮想環境を完全に消すときは | ||
- | sudo docker rm yoshitake01 | ||
- | |||
- | dockerの細かい使い方は別のサイトを参照してください。 |