TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

Chainerで学習したモデルを使ってcuDNNで推論する(dropout)

前回実装した、Chainerで学習したモデルを使用してcuDNNで推論するコードに、dropoutを追加した。

dropoutは学習時のみ処理を行うため、推論時には何もしなくてよい。
つまり、推論のネットワーク定義にはdropoutは必要ない。

学習用ネットワーク定義

学習用のネットワーク定義にdropoutを追加した。

nn.py
from chainer import Chain
import chainer.functions as F
import chainer.links as L

# ネットワーク定義
k = 16
fcl = 256
class NN(Chain):
    def __init__(self):
        super(NN, self).__init__()
        with self.init_scope():
            self.conv1 = L.Convolution2D(in_channels = 1, out_channels = k, ksize = 3, pad = 1)
            self.conv2 = L.Convolution2D(in_channels = k, out_channels = k, ksize = 3, pad = 1)
            self.l3    = L.Linear(7*7*k, fcl)
            self.l4    = L.Linear(fcl, 10)
            self.bn1   = L.BatchNormalization(k)
            self.bn2   = L.BatchNormalization(k)

    def __call__(self, x):
        h = self.conv1(F.reshape(x, (len(x), 1, 28, 28)))
        h = self.bn1(h)
        h = F.max_pooling_2d(F.relu(h), 2)
        h = self.conv2(h)
        h = self.bn2(h)
        h = F.max_pooling_2d(F.relu(h), 2)
        h = F.relu(self.l3(h))
        h = F.dropout(h, ratio=0.4)
        return self.l4(h)

推論

推論のネットワーク定義は、前回のままでよい。

実行結果

Chainerで推論した結果と、cuDNNで推論した結果が完全に一致することを確認した。


ソースをGitHubで公開しました。
github.com