Deep Learning: Exploring High Level APIs of Knet.jl and Flux.jl in comparison to Tensorflow-Keras === <!-- .element: style="font-size:100%" --> 2019/06/20 Al-Ahmadgaid B. Asaad <!-- .element: style="font-size:80%" --> [Blog Post](https://estadistika.github.io//julia/python/packages/knet/flux/tensorflow/machine-learning/deep-learning/2019/06/20/Deep-Learning-Exploring-High-Level-APIs-of-Knet.jl-and-Flux.jl-in-comparison-to-Tensorflow-Keras.html) (まとめ:[@antimon2](https://github.com/antimon2)) --- ## どんなもの? + 数値計算に傾倒している [Julia](https://julialang.org) の DeepLearning ライブラリを調査し、TF-Keras と比較してみた ---- + 結論: + Julia は十分に投資する価値がある + Julia は `for` ループ速い + Knet.jl は Julia + littleelse(ナットとボルト) + Flux.jl は入門・移行向けであり柔軟性を兼備 --- ## どうやって有効だと検証した? + [Flux.jl](https://github.com/FluxML/Flux.jl), [Knet.jl](https://github.com/denizyuret/Knet.jl) と TF-Keras で使用方法・学習速度・学習曲線を比較 + データセットは [Iris](https://en.wikipedia.org/wiki/Iris_flower_data_set) を使用 + その他、Python と Julia で同条件となるようコーディング --- ## 技術や手法の肝は? ---- ### データセットの準備 + TF-Keras: 教師トラベルのデータを 訓練用 と 検証用 に分ければ準備終わり + ミニバッチ分割・データ流し込みは自動 + Knet.jl: (分割した)データから `minibatch` オブジェクトを生成し訓練に利用 + Flux.jl: ラベルデータに one-hot エンコーディングが必要 + バッチ生成等は独自実装できる柔軟性を残している ---- ### モデル構築 + 3層MLP + TF-Keras, Knet.jl, Flux.jl ともに実装方法については大差はなし + 内部実装 + TF-Keras: 53% は C++実装 + Knet.jl/Flux.jl: いずれも 100% Julia ---- ### 訓練 + TF-Keras: `model.compile()` → `model.fit()` + `.fit()` で訓練データ・検証データ・バッチサイズ・エポック数を指定 + Knet.jl: `adam!(model, repeat(dtrn, 100))` + 検証を含むには `for x in adam(model, repeat(dtrn, 100)) ~` のようにしてループ内で処理 + Flux.jl: `Flux.@epochs 100 Flux.train!(loss, Flux.params(model), minibatches, Flux.ADAM(), cb=callback)` + `callback` に無引数関数を指定、検証やログ出力はその中で実行(もしくは `for` ループにしてその中で) <!-- .element: style="font-size:80%" --> ---- ![Loss比較](https://i.imgur.com/a55jxh6.png) ---- ### 評価 + 詳細略 ---- ![Accuracy比較](https://i.imgur.com/889wASU.png) ---- ### ベンチマーク + 詳細略 ---- ![ベンチマーク](https://i.imgur.com/1EEdtbt.png) --- ## 議論はある? + コードが全体的に不公平 + TFは内部で毎エポックシャッフルが走る(はず)だが、Julia側のコードは単純なデータ分割+シャッフル最初の1回だけの模様 + よく見るとそれぞれでバッチサイズ合ってない、1エポック辺りの事例数も合ってない + 100エポックとは言え Iris データセット(事例数合計150、入力4次元出力3次元)なので性能検査するには小さすぎる + ⇒Julia側の各結果は「バッチ(再)生成時間が含まれていないために速かった」「データが偏っていたためにたまたま精度が良かった」可能性が高い <!-- .element: style="font-size:75%" --> ---- ### 独自再検証 + (別件のデモのために)[Fashion-MNIST](https://github.com/zalandoresearch/fashion-mnist) で(主に速度を)再検証 + 速度重視、精度軽視(バッチ生成手抜き、バッチサイズと1エポック辺りの事例数は同等になるよう処理) + 結果 → [Knet.jl](https://nbviewer.jupyter.org/gist/antimon2/2939e75f2620112ac0525c677beab41c/FashionMNIST_Knet_Sample.jl.ipynb) / [Flux.jl](https://nbviewer.jupyter.org/gist/antimon2/2939e75f2620112ac0525c677beab41c/FashionMNIST_Flux_Sample.jl.ipynb) / [TF-Keras](https://nbviewer.jupyter.org/gist/antimon2/2939e75f2620112ac0525c677beab41c/FashionMNIST_TfKeras_Sample.py.ipynb) ---- + CNN(Conv層)を含めた学習は TF-Keras が圧倒的に速い + GPU不使用、CPU上の Conv の実装の問題かもしれない --- ## 先行研究と比べて何がすごい? + 《特になし》 --- ## 次に読むべき ~~論文~~ 記事は? + 「GPUを利用したモデル訓練に今後取り組みたい」と言っているので、その記事が上がったらそれ。
{"metaMigratedAt":"2023-06-14T22:43:18.422Z","metaMigratedFrom":"YAML","title":"Deep Learning: Exploring High Level APIs of Knet.jl and Flux.jl in comparison to Tensorflow-Keras","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"theme\":\"white\"}","contributors":"[{\"id\":\"80062a4b-8dad-49ac-95bf-848ce0686e9e\",\"add\":4025,\"del\":858}]"}
    1802 views