【続続】機械学習初心者がPytorchチュートリアルを改造しまくってCIFAR10の精度をあげる

#0 はじめに

<img width="384" alt="スクリーンショット 2019-06-11 22.48.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/ee4917d1-ec80-363e-6d16-fa93ed49ea76.png">

**かろうじて92%達成!**

前回の投稿
https://qiita.com/daikiclimate/items/0c1677c893203025a107

#1 前回の修正
前回の投稿にて、@t-aeさんにConv2dはpaddingを引数で処理できると教えてもらい直しました。
また、最初のピラミッド型に増やしてみたところですが、活性化関数を噛ませておらず、ただの線型結合で結ばれてしまうことから、意味がないことを教えていただきました。
ご指導ありがとうございます

#2 ピラミッド型の部分はもっとシンプルに
ピラミッドとは、入力層３チャネルと一層目の６４チャネルの間に1×1 convを挟んで段階的にフィルタを増やしてみよう的な試みです

前回のピラミッド

```
x= self.bn0(self.conv04(self.bn035(self.conv03(self.conv02(self.conv01(x))))))
```

今回のピラミッド

```
x = self.bn0(F.relu(self.conv04(self.bn035(F.relu(self.conv00(x))))))
```
self.conv00 = nn.Conv2d(3,8,1)
self.bn01 = nn.BatchNorm2d(8)
self.conv02 = nn.Conv2d(8,24 , 1)
self.bn03 = nn.BatchNorm2d(24)
self.conv1 = nn.Conv2d(24, 64, 3,padding = 1)

結果的にはこの辺が良い結果になりました。

#3 weight decayの追加（これが92%の壁を破ったと思っている）
前回の記事での内容に引き続き**dropout**は未使用で**BatchNormalization**を大量に使っている。
しかしやはり過学習を起こすので、weight_decayを追加し、良さげな値を模索した結果こうなりました。

```
optimizer = optim.SGD(net.parameters(), lr = 0.01, momentum=0.9, weight_decay = 0.008)
```
#3.5 表示の仕方を大幅に更新　
上の写真にあるように
epoch train_loss test_loss accuracy timeを載せるようにしました

# 結果
さて、忘れられつつあるPytorchTutorialですが、現状だと、
data_augmentation
network構造
BatchNormalization
weight_decayの追加
schedulerの追加
あたりですかね。

次回はdata_augmentationを強化して精度があがるかを試してみたいと思います。

# source
https://github.com/daikiclimate/CIFAR10/tree/master/CIFAR10_92%25

ソースlog.txtにて実行結果を保存してあります。

# summary

```
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1            [-1, 8, 32, 32]              32
       BatchNorm2d-2            [-1, 8, 32, 32]              16
            Conv2d-3           [-1, 24, 32, 32]             216
       BatchNorm2d-4           [-1, 24, 32, 32]              48
            Conv2d-5           [-1, 64, 32, 32]          13,888
       BatchNorm2d-6           [-1, 64, 32, 32]             128
            Conv2d-7           [-1, 64, 32, 32]          36,928
            Conv2d-8           [-1, 64, 32, 32]          36,928
         MaxPool2d-9           [-1, 64, 16, 16]               0
           Conv2d-10          [-1, 128, 16, 16]          73,856
      BatchNorm2d-11          [-1, 128, 16, 16]             256
           Conv2d-12          [-1, 128, 16, 16]         147,584
           Conv2d-13          [-1, 128, 16, 16]         147,584
        MaxPool2d-14            [-1, 128, 8, 8]               0
           Conv2d-15            [-1, 256, 8, 8]         295,168
      BatchNorm2d-16            [-1, 256, 8, 8]             512
           Conv2d-17            [-1, 256, 8, 8]         590,080
           Conv2d-18            [-1, 256, 8, 8]         590,080
        MaxPool2d-19            [-1, 256, 4, 4]               0
      BatchNorm2d-20            [-1, 256, 4, 4]             512
           Conv2d-21            [-1, 100, 4, 4]          25,700
           Conv2d-22             [-1, 10, 1, 1]          16,010
================================================================
Total params: 1,975,526
Trainable params: 1,975,526
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.01
Forward/backward pass size (MB): 4.26
Params size (MB): 7.54
Estimated Total Size (MB): 11.81
----------------------------------------------------------------
```