Chainer organizationやその他のリポジトリで同じCNNが複数実装されていたため比較しました。
執筆時のバージョンは以下のとおりです。
- Chainer: v4.2.0
- ChainerMN: v1.3.0
-
Chainer Benchmark:
04eb2aaf9fd85c66a42a6e138209458745ced8b7 -
convnet-benchmarks:
b458aab61c0ac2257c0990119b5de15c1e886f02
CNN実装のあるパス
Chainer
- chainer/links/model/vision/*.py
-
GoogLeNet,VGG16Layers,ResNetLayers,ResNet[50,101,152]Layersを定義 -
chainer.Chainを継承 -
__call__(self, x, layers=['prob'])を実装 (入力xからラベル名layersの出力を返す) examples/imagenet/*.py-
AlexNet,AlexFp16,GoogLeNet,GoogLeNetBN,GoogLeNetBNFp16,NIN,ResNet50,ResNeXt50クラスを実装 -
chainer.Chainを継承 -
__call__(self, x, t)を実装 (入力x, 出力tから損失を返す) examples/modelzoo/download_model.py- AlexNet, CaffeNet, GoogLeNet, ResNetのCaffeの学習済みパラメタ・モデル定義をダウンロードするスクリプト
-
__call__(self, inputs, outputs)を実装 (入力{"data":x},{"ラベル名":t}から出力を返す) - モデル定義はCaffeの定義に準拠
ChainerMN
examples/imagenet/models/*.py-
AlexNet,GoogLeNet,GoogLeNetBN,NIN,ResNet50クラスを実装 (Chainerのexamples/imagenet/*.pyとほぼ同一) GoogLeNetBNはinc4c,inc4dの出力数がChainerのものと異なる (それぞれ160→128, 96→64)AlexFp16,GoogLeNetBNFp16,ResNeXt50は定義されていない-
ResNet50では畳み込みのグループ数が指定できなくなっている
Chainer Benchmark
benchmarks/convnet/nets/*.py-
Alex,GoogLeNet,overfeat,vggaクラスを定義 -
chainer.Chainを継承 -
forward(self, x)を実装 (入力xから最終層の出力を返す)
convnet-benchmarks
chainer/*.py- Chainer Benchmarkで実装されているモデルと同一
まとめ
| リポジトリ | パス | Forward計算 | AlexNet | GoogLeNet | ResNet |
|---|---|---|---|---|---|
| Chainer | chainer/links/model/vision/*.py |
__call__(self, x) |
✔ | ✔ | |
| 〃 | examples/imagenet/*.py |
__call__(self, x, t) |
✔ | ✔ | ✔ |
| 〃 | examples/modelzoo/download_model.py |
__call__(self, inputs, outputs) |
✔ | ✔ | ✔ |
| ChainerMN | examples/imagenet/models/*.py |
__call__(self, x, t) |
✔ | ✔ | ✔ |
| ChainerBM1 | benchmarks/convnet/nets/*.py |
forward(self, x) |
✔ | ✔ | |
| Convenet | chainer/*.py |
forward(self, x) |
✔ | ✔ |
AlexNetの差異
| リポジトリ | conv1,2のグループ数 | 畳み込み層フィルタ数 | 正規化層 | 入力サイズ | 16 bitモデル |
|---|---|---|---|---|---|
Chainer (imagenet) |
1 | 96,256,384,384,256 | LRN | 227 | ✔ |
Chainer (modelzoo)2
|
2 | 96,256,384,384,256 | LRN | 227 | |
| ChainerMN | 1 | 96,256,384,384,256 | LRN | 227 | |
| ChainerBM | 1 | 64,192,384,256,256 | 224 | ||
| Convenet | 1 | 64,192,384,256,256 | 224 |
感想
ONNXあたりでこういった記述が1つに統一できればいいですね (各FWの設計思想の違いで結局煩雑な変換処理が必要になりそう……)。