スキップしてメイン コンテンツに移動

Chainer初試行⇒成功 (ローカルPCのJupyter Notebook上、CPUでの実行、MNIST)


インストール直後の初回試行時は、net(x)の評価の行でエラーとなっていたが、
Jupyter Notebook再起動、PC再起動などを実施した後に、エラーが無くなる。
In [5]:
from chainer.datasets import mnist

# データセットがダウンロード済みでなければ,ダウンロードも行う
train_val, test = mnist.get_mnist(withlabel=True, ndim=1)
Downloading from http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz...
In [46]:
import matplotlib.pyplot as plt

plt.imshow(train_val[0][0].reshape(28, 28), cmap='gray', interpolation="none")
plt.show()
In [47]:
from chainer.datasets import split_dataset_random

train, valid = split_dataset_random(train_val, 50000, seed=0)
print(len(train), len(valid))
50000 10000
In [48]:
from chainer import iterators

batchsize = 128

train_iter = iterators.SerialIterator(train, batchsize)
valid_iter = iterators.SerialIterator(
    valid, batchsize, repeat=False, shuffle=False)
test_iter = iterators.SerialIterator(
    test, batchsize, repeat=False, shuffle=False)

train_mb = train_iter.next()
print(len(train_mb), len(train_mb[0]), len(train_mb[0][0]))
128 2 784
In [49]:
import chainer
import chainer.links as L
import chainer.functions as F

class MLP(chainer.Chain):

    def __init__(self, n_mid_units=100, n_out=10):
        super(MLP, self).__init__()

        # パラメータを持つ層の登録
        with self.init_scope():
            self.l1 = L.Linear(None, n_mid_units)
            self.l2 = L.Linear(n_mid_units, n_mid_units)
            self.l3 = L.Linear(n_mid_units, n_out)

    def forward(self, x):
        # データを受け取った際のforward計算を書く
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        return self.l3(h2)

gpu_id = -1  # CPUを用いる場合は,この値を-1にしてください

net = MLP()

if gpu_id >= 0:
    net.to_gpu(gpu_id)
In [50]:
from chainer import optimizers

optimizer = optimizers.SGD(lr=0.01).setup(net)
In [51]:
import numpy as np
from chainer.dataset import concat_examples
from chainer.cuda import to_cpu

max_epoch = 100

while train_iter.epoch < max_epoch:

    # ---------- 学習の1イテレーション ----------
    train_batch = train_iter.next()
    x, t = concat_examples(train_batch, gpu_id)

    # 予測値の計算
    y = net(x)

    # 損失の計算
    loss = F.softmax_cross_entropy(y, t)

    # 勾配の計算
    net.cleargrads()
    loss.backward()

    # パラメータの更新
    optimizer.update()
    # --------------- ここまで ----------------

    # 1エポック終了ごとにValidationデータに対する予測精度を測って,
    # モデルの汎化性能が向上していることをチェックしよう
    if train_iter.is_new_epoch:  # 1 epochが終わったら

        # 損失の表示
        print('epoch:{:02d} train_loss:{:.4f} '.format(train_iter.epoch, float(to_cpu(loss.data))), end='')

        valid_losses = []
        valid_accuracies = []
        while True:
            valid_batch = valid_iter.next()
            x_valid, t_valid = concat_examples(valid_batch, gpu_id)

            # Validationデータをforward
            with chainer.using_config('train', False), chainer.using_config('enable_backprop', False):
                y_valid = net(x_valid)

            # 損失を計算
            loss_valid = F.softmax_cross_entropy(y_valid, t_valid)
            valid_losses.append(to_cpu(loss_valid.array))

            # 精度を計算
            accuracy = F.accuracy(y_valid, t_valid)
            accuracy.to_cpu()
            valid_accuracies.append(accuracy.array)

            if valid_iter.is_new_epoch:
                valid_iter.reset()
                break

        print('val_loss:{:.4f} val_accuracy:{:.4f}'.format(mean(valid_losses), mean(valid_accuracies)))    
epoch:01 train_loss:0.8887 val_loss:0.8989 val_accuracy:0.8076
epoch:02 train_loss:0.5093 val_loss:0.5177 val_accuracy:0.8645
epoch:03 train_loss:0.3630 val_loss:0.4169 val_accuracy:0.8850
epoch:04 train_loss:0.2996 val_loss:0.3721 val_accuracy:0.8953
epoch:05 train_loss:0.2262 val_loss:0.3453 val_accuracy:0.9024
epoch:06 train_loss:0.3406 val_loss:0.3236 val_accuracy:0.9084
epoch:07 train_loss:0.2654 val_loss:0.3077 val_accuracy:0.9140
epoch:08 train_loss:0.2552 val_loss:0.2968 val_accuracy:0.9181
epoch:09 train_loss:0.2441 val_loss:0.2840 val_accuracy:0.9199
epoch:10 train_loss:0.2820 val_loss:0.2734 val_accuracy:0.9242
epoch:11 train_loss:0.3409 val_loss:0.2653 val_accuracy:0.9246
epoch:12 train_loss:0.1918 val_loss:0.2556 val_accuracy:0.9276
epoch:13 train_loss:0.2212 val_loss:0.2482 val_accuracy:0.9296
epoch:14 train_loss:0.1829 val_loss:0.2403 val_accuracy:0.9318
epoch:15 train_loss:0.1443 val_loss:0.2338 val_accuracy:0.9344
epoch:16 train_loss:0.2143 val_loss:0.2284 val_accuracy:0.9343
epoch:17 train_loss:0.2635 val_loss:0.2208 val_accuracy:0.9381
epoch:18 train_loss:0.2276 val_loss:0.2177 val_accuracy:0.9375
epoch:19 train_loss:0.1305 val_loss:0.2106 val_accuracy:0.9408
epoch:20 train_loss:0.1854 val_loss:0.2073 val_accuracy:0.9410
epoch:21 train_loss:0.1682 val_loss:0.2015 val_accuracy:0.9427
epoch:22 train_loss:0.1237 val_loss:0.1966 val_accuracy:0.9430
epoch:23 train_loss:0.1749 val_loss:0.1925 val_accuracy:0.9454
epoch:24 train_loss:0.1995 val_loss:0.1901 val_accuracy:0.9455
epoch:25 train_loss:0.1408 val_loss:0.1853 val_accuracy:0.9479
epoch:26 train_loss:0.1736 val_loss:0.1834 val_accuracy:0.9480
epoch:27 train_loss:0.1108 val_loss:0.1787 val_accuracy:0.9501
epoch:28 train_loss:0.1097 val_loss:0.1752 val_accuracy:0.9507
epoch:29 train_loss:0.1638 val_loss:0.1724 val_accuracy:0.9509
epoch:30 train_loss:0.1500 val_loss:0.1698 val_accuracy:0.9514
epoch:31 train_loss:0.1796 val_loss:0.1673 val_accuracy:0.9530
epoch:32 train_loss:0.2374 val_loss:0.1636 val_accuracy:0.9538
epoch:33 train_loss:0.1362 val_loss:0.1617 val_accuracy:0.9530
epoch:34 train_loss:0.2487 val_loss:0.1596 val_accuracy:0.9540
epoch:35 train_loss:0.1474 val_loss:0.1570 val_accuracy:0.9549
epoch:36 train_loss:0.1056 val_loss:0.1571 val_accuracy:0.9547
epoch:37 train_loss:0.0773 val_loss:0.1526 val_accuracy:0.9556
epoch:38 train_loss:0.0938 val_loss:0.1505 val_accuracy:0.9562
epoch:39 train_loss:0.0942 val_loss:0.1486 val_accuracy:0.9568
epoch:40 train_loss:0.1154 val_loss:0.1462 val_accuracy:0.9569
epoch:41 train_loss:0.1394 val_loss:0.1450 val_accuracy:0.9577
epoch:42 train_loss:0.1280 val_loss:0.1426 val_accuracy:0.9580
epoch:43 train_loss:0.0823 val_loss:0.1412 val_accuracy:0.9587
epoch:44 train_loss:0.1909 val_loss:0.1392 val_accuracy:0.9599
epoch:45 train_loss:0.2418 val_loss:0.1376 val_accuracy:0.9592
epoch:46 train_loss:0.1126 val_loss:0.1367 val_accuracy:0.9597
epoch:47 train_loss:0.1508 val_loss:0.1359 val_accuracy:0.9598
epoch:48 train_loss:0.1532 val_loss:0.1336 val_accuracy:0.9608
epoch:49 train_loss:0.0791 val_loss:0.1318 val_accuracy:0.9614
epoch:50 train_loss:0.1898 val_loss:0.1308 val_accuracy:0.9620
epoch:51 train_loss:0.0980 val_loss:0.1294 val_accuracy:0.9625
epoch:52 train_loss:0.0807 val_loss:0.1273 val_accuracy:0.9631
epoch:53 train_loss:0.0937 val_loss:0.1271 val_accuracy:0.9636
epoch:54 train_loss:0.0807 val_loss:0.1267 val_accuracy:0.9625
epoch:55 train_loss:0.0712 val_loss:0.1250 val_accuracy:0.9638
epoch:56 train_loss:0.0532 val_loss:0.1233 val_accuracy:0.9640
epoch:57 train_loss:0.0752 val_loss:0.1208 val_accuracy:0.9651
epoch:58 train_loss:0.1053 val_loss:0.1197 val_accuracy:0.9658
epoch:59 train_loss:0.0758 val_loss:0.1197 val_accuracy:0.9650
epoch:60 train_loss:0.0722 val_loss:0.1179 val_accuracy:0.9652
epoch:61 train_loss:0.0632 val_loss:0.1164 val_accuracy:0.9665
epoch:62 train_loss:0.0843 val_loss:0.1172 val_accuracy:0.9658
epoch:63 train_loss:0.0508 val_loss:0.1145 val_accuracy:0.9672
epoch:64 train_loss:0.0373 val_loss:0.1136 val_accuracy:0.9682
epoch:65 train_loss:0.1197 val_loss:0.1135 val_accuracy:0.9676
epoch:66 train_loss:0.0429 val_loss:0.1117 val_accuracy:0.9677
epoch:67 train_loss:0.0740 val_loss:0.1132 val_accuracy:0.9673
epoch:68 train_loss:0.0424 val_loss:0.1108 val_accuracy:0.9681
epoch:69 train_loss:0.1476 val_loss:0.1100 val_accuracy:0.9679
epoch:70 train_loss:0.0553 val_loss:0.1089 val_accuracy:0.9685
epoch:71 train_loss:0.0822 val_loss:0.1094 val_accuracy:0.9678
epoch:72 train_loss:0.0992 val_loss:0.1081 val_accuracy:0.9686
epoch:73 train_loss:0.1779 val_loss:0.1068 val_accuracy:0.9682
epoch:74 train_loss:0.0583 val_loss:0.1078 val_accuracy:0.9680
epoch:75 train_loss:0.0975 val_loss:0.1061 val_accuracy:0.9688
epoch:76 train_loss:0.0976 val_loss:0.1062 val_accuracy:0.9697
epoch:77 train_loss:0.0370 val_loss:0.1044 val_accuracy:0.9699
epoch:78 train_loss:0.0303 val_loss:0.1048 val_accuracy:0.9699
epoch:79 train_loss:0.0528 val_loss:0.1036 val_accuracy:0.9696
epoch:80 train_loss:0.0971 val_loss:0.1022 val_accuracy:0.9704
epoch:81 train_loss:0.1019 val_loss:0.1038 val_accuracy:0.9689
epoch:82 train_loss:0.0521 val_loss:0.1017 val_accuracy:0.9702
epoch:83 train_loss:0.0323 val_loss:0.1011 val_accuracy:0.9701
epoch:84 train_loss:0.0763 val_loss:0.1003 val_accuracy:0.9713
epoch:85 train_loss:0.0655 val_loss:0.0997 val_accuracy:0.9714
epoch:86 train_loss:0.0651 val_loss:0.1012 val_accuracy:0.9695
epoch:87 train_loss:0.0166 val_loss:0.0993 val_accuracy:0.9710
epoch:88 train_loss:0.0307 val_loss:0.1010 val_accuracy:0.9697
epoch:89 train_loss:0.1144 val_loss:0.0985 val_accuracy:0.9711
epoch:90 train_loss:0.0767 val_loss:0.0982 val_accuracy:0.9715
epoch:91 train_loss:0.0835 val_loss:0.0974 val_accuracy:0.9715
epoch:92 train_loss:0.0286 val_loss:0.0974 val_accuracy:0.9716
epoch:93 train_loss:0.0746 val_loss:0.0971 val_accuracy:0.9714
epoch:94 train_loss:0.0453 val_loss:0.0964 val_accuracy:0.9718
epoch:95 train_loss:0.0142 val_loss:0.0963 val_accuracy:0.9728
epoch:96 train_loss:0.0721 val_loss:0.0960 val_accuracy:0.9722
epoch:97 train_loss:0.0210 val_loss:0.0956 val_accuracy:0.9721
epoch:98 train_loss:0.0467 val_loss:0.0960 val_accuracy:0.9716
epoch:99 train_loss:0.0789 val_loss:0.0952 val_accuracy:0.9725
epoch:100 train_loss:0.0778 val_loss:0.0945 val_accuracy:0.9724
  • gpu_id=-1に設定。
  • インストール直後の初回試行時は、ここでのnet(x)の評価の行でエラーとなっていたが、Jupyter Notebook再起動、PC再起動などを実施した後に、エラーが無くなる。
  • i7-CoreのCPUでpython.exeが50%使用になり、マルチスレッドでの実行になっている。
In [52]:
# テストデータでの評価
test_accuracies = []
while True:
    test_batch = test_iter.next()
    x_test, t_test = concat_examples(test_batch, gpu_id)

    # テストデータをforward
    with chainer.using_config('train', False), chainer.using_config('enable_backprop', False):
        y_test = net(x_test)

    # 精度を計算
    accuracy = F.accuracy(y_test, t_test)
    accuracy.to_cpu()
    test_accuracies.append(accuracy.array)

    if test_iter.is_new_epoch:
        test_iter.reset()
        break

print('test_accuracy:{:.4f}'.format(mean(test_accuracies)))
test_accuracy:0.9723
In [53]:
from chainer import serializers

serializers.save_npz('my_mnist.model', net)
In [54]:
# まず同じネットワークのオブジェクトを作る
infer_net = MLP()

# そのオブジェクトに保存済みパラメータをロードする
serializers.load_npz('my_mnist.model', infer_net)
In [55]:
gpu_id = -1  # CPUで計算をしたい場合は,-1を指定してください

if gpu_id >= 0:
    infer_net.to_gpu(gpu_id)

# 1つ目のテストデータを取り出します
x, t = test[random.randint(0, len(test))]  #  tは使わない

# どんな画像か表示してみます
plt.imshow(x.reshape(28, 28), cmap='gray', interpolation="none")
plt.show()

# ミニバッチの形にする(複数の画像をまとめて推論に使いたい場合は,サイズnのミニバッチにしてまとめればよい)
print('元の形:', x.shape, end=' -> ')

x = x[None, ...]

print('ミニバッチの形にしたあと:', x.shape)

# ネットワークと同じデバイス上にデータを送る
x = infer_net.xp.asarray(x)

# モデルのforward関数に渡す
with chainer.using_config('train', False), chainer.using_config('enable_backprop', False):
    y = infer_net(x)

# Variable形式で出てくるので中身を取り出す
y = y.array

# 結果をCPUに送る
y = to_cpu(y)

# 予測確率の最大値のインデックスを見る
pred_label = y.argmax(axis=1)

print('ネットワークの予測:', pred_label[0], "真値ラベル:", t)
元の形: (784,) -> ミニバッチの形にしたあと: (1, 784)
ネットワークの予測: 1 真値ラベル: 1
成功。

コメント

このブログの人気の投稿

1906.09 ChainerのNNモデルの定義でビギナーが陥りやすいエラー 4例

1906.09 ChainerのNNモデルの定義でビギナーが陥りやすいエラー 4例 Chainerを始めて、エラーが起こると、そのエラーの説明表示を見ても、よく分からないことが多い。ここでは、問題形式で、ビギナーが陥りやすいエラーを4例、挙げてみました。 例1 例えば、以下のコードを実行すると「Expect: in_types[2].dtype == in_types[0].dtype」「Actual: float32 != float64」のエラーが発生する。何がいけないのか? In [1]: # sec: lib import numpy as np import chainer import chainer.links as L import chainer.functions as F # sec: ver chainer . print_runtime_info () Platform: Windows-7-6.1.7601-SP1 Chainer: 5.3.0 NumPy: 1.16.2 CuPy: Not Available iDeep: Not Available NNモデルを定義 In [2]: class MyConvNet ( chainer . Chain ): def __init__ ( self ): super ( MyConvNet , self ) . __init__ () # パラメータを持つ層の登録 with self . init_scope (): self . c1 = L . Convolution2D ( None , 20 , ksize = 3 , stride = 2 , pad = 0 ) self . c2 = L . Convolution2D ( None , 40 , ksize = 3 , stride = 2 , pad = 0 ) self . l1 ...

Jupyter Notebook (.ipynb)の綺麗な見た目のまま内容をブログで公開する方法

検索 Webを探してみても、意外と、Jupyter Notebook (.ipynb)の内容を、簡単で綺麗に表示できる方法が見当たらない。 https://minus9d.hatenablog.com/entry/2018/03/17/153537 Github  Githubのレポジトリに登録された.ipynbファイルは自動的に整形されて閲覧できます。 Gist  .ipynbファイルのテキストを全文コピーしてGistに貼り付け Binder (beta) Herokuの無料枠を使ってJupyterサーバを立てる nbconvertコマンドを使ってHTMLやMarkdownに変換し加工 別サイトのサービスを利用しなくてはならないと、記事を書く度に毎回、アップロード操作しなくてはならない。 どれも面倒。 そこで 記事の原稿はローカルPCに残る 投稿操作は1回きりで楽 HTMLをそのまま貼り付けたい を満たすような方法を模索すると、以下の方法で、おおよそ 簡単にJupyter Notebookの内容をそのままブログに載せられる ことが分かった。 方法 ブログ記事の作成・編集、コードの実行・試行錯誤は、すべてローカルのPCのJupyter Notebook(.ipynb)上で作る。  ↓ Jupyter Notebookのメニュー→File→ Print Preview でプレビューを表示。 プレビューページ が表示される。  ↓ プレビューページの一部・全てを選択して、 コピー 。  ↓ ブログ(Bloggerを使用)サイトで新規記事を作成して、 ペースト 。 プレビュー表示のHTMLが、そのまま維持・貼り付けされる。  ↓ ブログを投稿。 利点 この方法であれば、かなり書きやすい。 ローカルのPCに原稿の 文章データ(.ipynb)はすべて残り 、安心。 ブログに投稿しても、見た目がほとんど同じ、 綺麗な見た目のまま を維持可。 ブログへの投稿は、 コピー&ペーストだけ でOK、非常に楽。 グラフ画像も、コピー&ペーストで同様に一括で貼り付け られて投稿されるので、楽。 ブログ記事の修正投稿は、ローカル...

98%精度のNNモデルが間違える画像(MNIST)とは?

「28x28数字画像入力→L.Linear(100ノード)→L.Linear(100ノード)→L.Linear(10ノード)→10出力クラス」の形のNNモデルを、MNISTデータで98%精度まで学習させた予測器を使用して、MNIST画像データの中を少し深く掘り下げて見てみる。 記事: Chainer初試行⇒成功 のNNモデル・結果を利用。 NNモデルのロード In [1]: import chainer import chainer.links as L import chainer.functions as F class MLP ( chainer . Chain ): def __init__ ( self , n_mid_units = 100 , n_out = 10 ): super ( MLP , self ) . __init__ () # パラメータを持つ層の登録 with self . init_scope (): self . l1 = L . Linear ( None , n_mid_units ) self . l2 = L . Linear ( n_mid_units , n_mid_units ) self . l3 = L . Linear ( n_mid_units , n_out ) def forward ( self , x ): # データを受け取った際のforward計算を書く h1 = F . relu ( self . l1 ( x )) h2 = F . relu ( self . l2 ( h1 )) return self . l3 ( h2 ) In [2]: from chainer import serializers my_net = MLP () serializers . load_npz ( 'my_mnis...

Chainerをインストール⇒成功 (ローカルPCのJupyter Notebook上、pipを利用)

ローカルPCで稼働するJupyter NotebookのPythonにChainerをインストール。 Jupyter Notebookは、WinPython 32bit 3.5.2.3 Qt5をインストールして、導入。 1行「!pip install chainer」を実行するだけ でOK、非常に簡単。 In [3]: ! pip install chainer Collecting chainer Downloading https://files.pythonhosted.org/packages/6d/a1/8e9110a60e045341e36910568cd53f54a791fff6844448a46331f597177f/chainer-5.2.0.tar.gz (513kB) Collecting filelock (from chainer) Downloading https://files.pythonhosted.org/packages/d7/ca/3c74396a9ed8a4cfab5459800edeef9a1269591cb21f5a49bd71a49c5fa2/filelock-3.0.10-py3-none-any.whl Requirement already satisfied: numpy>=1.9.0 in c:\users\sample\winpython-32bit-3.5.2.3qt5\python-3.5.2\lib\site-packages (from chainer) (1.11.2+mkl) Collecting protobuf>=3.0.0 (from chainer) Downloading https://files.pythonhosted.org/packages/20/b7/fd638c741e9a75da0ff955b50cf42ddb71042575e5ba14d6ffd269e37a24/protobuf-3.6.1-cp35-cp35m-win32.whl (935kB) Requirement already satisfied: six>=1.9.0 in c:\users\sampl...

NNモデルの評価値をもう一度計算⇒成功 (必要部分だけ抜粋したコードをもう一度書く)

抜粋したコードで評価 Iterator⇒成功 In [56]: my_net = MLP () serializers . load_npz ( 'my_mnist.model' , my_net ) In [57]: train_iter = iterators . SerialIterator ( train_val , batchsize ) x , t = concat_examples ( train_iter . next (), gpu_id ) with chainer . using_config ( 'train' , False ), chainer . using_config ( 'enable_backprop' , False ): y = net ( x ) accuracy = F . accuracy ( y , t ) print ( accuracy . array ) 0.984375 抜粋したコードで評価 画像1枚⇒成功 In [59]: x , t = test [ random . randint ( 0 , len ( test ))] x = infer_net . xp . asarray ( x [ None , ... ]) with chainer . using_config ( 'train' , False ), chainer . using_config ( 'enable_backprop' , False ): y = infer_net ( x ) y = y . array print ( y ) print ( y . argmax ( axis = 1 )[ 0 ], t ) [[ -0.13074946 -3.27831101 14.03434944 4.3200264 -9.22432804 -6.01922178 ...

1906.07 Chainer NNモデルの中間層でデータを分岐・結合する方法

1906.07 Chainer NNモデルの中間層でデータを分岐・結合 chainer.functionsの「reshape」と「concat」を用いて結合できる模様。 https://docs.chainer.org/en/stable/reference/generated/chainer.functions.reshape.html https://docs.chainer.org/en/stable/reference/generated/chainer.functions.concat.html#chainer.functions.concat In [1]: # sec: lib import numpy as np import chainer import chainer.links as L import chainer.functions as F # sec: ver chainer . print_runtime_info () Platform: Windows-7-6.1.7601-SP1 Chainer: 5.3.0 NumPy: 1.16.2 CuPy: Not Available iDeep: Not Available NNモデルを定義 In [61]: # sec: NNモデルの定義 class MyConvNet ( chainer . Chain ): def __init__ ( self ): super ( MyConvNet , self ) . __init__ () # パラメータを持つ層の登録 with self . init_scope (): self . c1 = L . Convolution2D ( None , 10 , ksize = 3 , stride = 2 , pad = 0 ) self . c2 = L . Convolution2D ( None , 10 , ksi...