🥀

えっちなサイトを作る(12)

2021/08/05に公開

引き続きえっちなゲームがプレイできちゃうサイトを作ろうと頑張ります。

TensorFlowを利用して、設計設計からモデルを作る練習を進めています。
最新の技術に追いつくのは中々大変です…🤨

前回からの課題

  • 課題:書籍を購入し内容を実践する
    • 課題:書籍の発売時から1年経ってるので完了後に再度技術調査必要
      • 課題:DeepCreamPyの実用性について調査
    • 課題:ブックマーク整理
  • 課題:個人開発をはじめよう本でMVPについてもうちょっと知る

モザイク除去から学ぶ最先端のディープラーニング本をやる(3)

https://qiita.com/koshian2/items/aefbe4b26a7a235b5a5e

1章

畳み込みニューラルネットワーク(CNN)

  • Conv2D + BN + ReLUのセットを何度も利用する
  • ダウンサンプリングする層も使う
    • Pooling層という
      • 計算量が減らせる
      • 大域的特徴量を拾える
    • max Poolingとaverage poolingがある
  • 出力層では2階のテンソルに変換したい
    • Global Average Poolingを利用

演習(1-3)

  • CIFER-10の分類問題
    • TensorFlowでの10層のモデルの実装
      • 畳み込み層9層+ 全結合層1層
    • epocs = 50 batchsize = 128で学習
    • validation : loss = 0.8009 accuracy = 0.8552
    • よさそう

ResNet

  • CNNで層を増やしまくると精度が上がらなくなる
    • Residual Blockの仕組みを導入する
      • 層の組み合わせとバイパスした出力を足し込む方式
    • Residual Blockの構成は論文によって異なる
      • GANではpre-act方式が取られる

Colab TPUでのCNNの訓練(Keras API)

  • keras APIを使う場合はランタイム設定とTPU初期化コマンドだけで行ける

Colab TPUでのCNNの訓練(カスタム訓練ループ)

自前でカスタム訓練ループを作る

  • データはTensorFlowのデータセットに変換する必要がある
  • Distributed Training
    • 複数のGPU/TPUで分割して計算する
    • Data Parallel : データ分割方式
    • Model Parallel : モデル分割方式
  • Data Parallel
    • Map-Reduce処理が行われる
    • Mapされたデータの塊をReplicaと呼ぶ
  • Reduce処理の実装
    • 難しい…Distributed Trainingは個別に入門したほうが良さそう
  • 損失関数の実装
  • バッチ単位の訓練の実装
    • 難しい…基本的な訓練の処理を知ってないとダメそうだ
  • バッチ単位のValidationの実装
  • 訓練ループの実装

演習(1-option)

Google ColabのTPUを利用したResNetの実装

  • TPU利用時には、ランタイム設定と初期化が必要
  • CIFER-10の分類問題を解く
  • ResNet
    • Residual Block(pre-act方式)
      • main path : BatchNorm - ReLu - Conv - BatchNorm - ReLu - Conv
      • shortcut path : conv or identity
    • ResNet全体 : 121層
    • オプティマイザ : SGD (学習率 0.1,Momentum 0.9)
    • 学習率減衰 : Multi Step Decay
    • バッチアサイズ : 128
    • 100epochs
  • TPUにて学習
    • 完了まで22分(!)
    • validation : loss = 0.7639 accuracy = 0.8851
    • CNNよりaccuracyが改善した

カスタム訓練ループの作成

  • データセットをtf.dataに変換
  • Distibuted Training
    • map reduce設計
    • 難しい…
  • 損失関数・評価関数のオブジェクト化
  • バッチ単位の訓練・Validation
  • 訓練ループの実施
    • epoch 100
    • 実行時間 : 48分!
    • Validation : loss = 0.76713747 accuracy = 0.8583
  • まとめ
    • Kerasよりも実行時間が伸びた
    • 精度は同じぐらい(同じレイヤー設計なので当たり前ではあるが)

まとめメモ

  • Keras API & TPUの組み合わせは結構簡単に実行できる
  • Map-reduceのコードは全然読めなかったので、必要になったらpython勉強する

その他

  • 書籍の学習が長くなりそうなので、各章の進捗が分かるようにGitHubにissueを作成
    • 独学大全の1/100プランニングを参考

終わり

Kerasを使わないカスタム訓練ループの実装はキツいですね…。
後半の章でまた再入門することになりそうです。

Discussion