ニューラルネットワークで手書き文字判別

今週月、水曜日に「PyTorchを使ったディープラーニング」セミナーがありました。

内容はディープラーニングの一般的な流れと実装方法についてです。

  1. ネットワークの構築
  2. loss関数の選択
  3. optimizerの選択と訓練

上記の解説後に手書き文字画像から内容を識別するプログラムを作成します。

ニューラルネットワークの構築

f:id:denim012:20190418220131p:plain

引用元:ニューラルネットワーク - Wikipedia

 Pytorchで入力層 1ノード、隠れ層 1層10ノード、出力層 2ノード、活性関数ReLUのニューラルネットワークの記載方法は2種類あります。

 1.torch.nn.Sequential

mynet = torch.nn.Sequential(
torch.nn.Linear(1, 10),
torch.nn.ReLU(),
torch.nn.Linear(10, 2)
)

 2.torch.nn.Module

class SimpleNet(torch.nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.hidden = torch.nn.Linear(1, 10)
self.predict = torch.nn.Linear(10, 2)
 
def forward(self, x):
hidden_result = self.hidden(x)
x = F.relu(hidden_result)
x = self.predict(x)
return x

 1.の方が簡単に記載でき、2.の方が柔軟性に富んだ書き方になります。

Loss関数の選択

ニューラルネットワークでの出力値と実際の値を比較するLoss関数は、回帰を行うのか分類を行うのかで利用するものが異なります。

回帰ではL1-norm、L2-normなどがあり、分類ではCross-entropy lossなどが使用されます。

optimizerの選択と訓練

ニューラルネットワークを最適化するアルゴリズムにはgradient descent(最急降下法)があります。毎回訓練する際にどれだけのデータを利用するのかにより下記種類があります。

Batch gradient descent(BGD):全件データ使用。処理が遅くメモリを大量消費。

Stochastic gradient descent(SGD):1データを使用。訓練課程が安定せず波が大きい。

Mini-batch gradient descent:一部分のデータを使用。BGDとSGDの中間。

また、上記以外にもMomentum、Nesterov accelerated gradient、Adagrad、Adadelta、RMSprop、Adamがあります。

 手書き文字の識別

最後にこれらを使用して、手書きで書かれた数字の画像を学習し画像から0~9までを分類するプログラムを作成します。

隠れ層2層、活性関数Reluのニューラルネットワークを作成して、Loss関数はCross-entropy lossを使用。optimizerにはAdam(mini batch:バッチサイズ32)を使用して4万件のデータで訓練を行います。学習結果をテストデータに適用したところ正解率は95%でした。その後optimizerや隠れ層の層数を変更し正解率がどのように変わるかを確認します。