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

#-1 （6月11日追記）コメント頂いたこと
@t-ae さんの指摘によりごく当然な問題が発覚しました。
直そうかとも思ったのですが、いただいた助言は後の章で修正するのに役に立たせてもらうとして、
反面教師としてそのまま残しておこうと思います。

###a: 「２」のところでいうようにピラミッド型に増やしたが活性化関数がついていない
→これは線形変換になってしまうため、層を増やすメリットがまったくなくなる。

###b: nn.Conv2dの引数でゼロパディングがある
→手動でやるのは大変見にくいので、ぜひこれを使いましょう


#0 はじめに
2%の精度があがりました！
89%到達です！

<img width="498" alt="スクリーンショット 2019-06-10 8.40.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404462/fa206fd4-592e-67fa-b704-a52df5a73e92.png">

という喜びの叫びからスタート。続きです。
前回は以下の記事にて、CIFAR10で87%を達成しました。
https://qiita.com/daikiclimate/items/020f12778200460f73f4

（やってみると85%から先がなかなかあがらなくて・・・）

ResNetは使わずにPytorchチュートリアルの改造で90%の達成が目標です。

大きく編集した個所は2か所です。

#1 dropout層を消した

過学習を起こしているのはわかるんです。グラフ見れば。
ただ、調べてみると、Batchnormとdropoutは併用すると推論時にあまり良い影響を及ぼさないらしいです。
＜参考になる論文＞
https://arxiv.org/abs/1801.05134

ということでとりあえずDropout層を消すと

###めっちゃ学習速い！

これはもろもろ実験がはかどる・・・というのと、何より

**速いのに精度の最大値は変わらない**

ということで消してみました。

#2 Pyramid形にフィルタを増やす

かねてより、
入力層（フィルタ:3）
conv（フィルタ:64）

というのに無理を感じていた。そんなに突然情報量を増やしていけるもんかと。

というところで「MaxPoolingでフィルタを2倍にする」という手法より、「少しずつフィルタを増加させていく」ほうが良いと噂で聞きました。
どうするのが良いのか分からなかったが、1*1 conv層で1層目までに少しつフィルタを増加させていくようにしてみました。

入力層（３層）
１×1 conv(フィルタ:6)
１×1 conv(フィルタ:12)
１×1 conv(フィルタ:24)
１×1 conv(フィルタ:48)
3×3 conv（フィルタ:64）

としてみました

#おわりに
短めですが、dropoutなくても性能が変わらないというのに驚きを覚え、記事にしてしまいました。
次は90%達成したときにあげようと思います。

#ソース
https://github.com/daikiclimate/CIFAR10/tree/master/CIFAR10_89%25

# パラメータ数

```
            Conv2d-1            [-1, 6, 32, 32]              24
            Conv2d-2           [-1, 12, 32, 32]              84
            Conv2d-3           [-1, 24, 32, 32]             312
       BatchNorm2d-4           [-1, 24, 32, 32]              48
            Conv2d-5           [-1, 48, 32, 32]           1,200
       BatchNorm2d-6           [-1, 48, 32, 32]              96
     ConstantPad2d-7           [-1, 48, 34, 34]               0
            Conv2d-8           [-1, 64, 32, 32]          27,712
       BatchNorm2d-9           [-1, 64, 32, 32]             128
    ConstantPad2d-10           [-1, 64, 34, 34]               0
           Conv2d-11           [-1, 64, 32, 32]          36,928
    ConstantPad2d-12           [-1, 64, 34, 34]               0
           Conv2d-13           [-1, 64, 32, 32]          36,928
        MaxPool2d-14           [-1, 64, 16, 16]               0
    ConstantPad2d-15           [-1, 64, 18, 18]               0
           Conv2d-16          [-1, 128, 16, 16]          73,856
      BatchNorm2d-17          [-1, 128, 16, 16]             256
    ConstantPad2d-18          [-1, 128, 18, 18]               0
           Conv2d-19          [-1, 128, 16, 16]         147,584
    ConstantPad2d-20          [-1, 128, 18, 18]               0
           Conv2d-21          [-1, 128, 16, 16]         147,584
        MaxPool2d-22            [-1, 128, 8, 8]               0
    ConstantPad2d-23          [-1, 128, 10, 10]               0
           Conv2d-24            [-1, 256, 8, 8]         295,168
      BatchNorm2d-25            [-1, 256, 8, 8]             512
    ConstantPad2d-26          [-1, 256, 10, 10]               0
           Conv2d-27            [-1, 256, 8, 8]         590,080
    ConstantPad2d-28          [-1, 256, 10, 10]               0
           Conv2d-29            [-1, 256, 8, 8]         590,080
        MaxPool2d-30            [-1, 256, 4, 4]               0
      BatchNorm2d-31            [-1, 256, 4, 4]             512
           Conv2d-32            [-1, 100, 4, 4]          25,700
           Conv2d-33             [-1, 10, 1, 1]          16,010
              Net-34                   [-1, 10]               0
=================================================================
Total params: 1,990,802
Trainable params: 1,990,802
Non-trainable params: 0
-----------------------------------------------------------------
Input size (MB): 0.01
Forward/backward pass size (MB): 7.86
Params size (MB): 7.59
Estimated Total Size (MB): 15.47
-----------------------------------------------------------------
```