機械学習ダイアリー ~StyleGANの学習~ (train.py)

こんにちは、mzです。追記のおまけでStyleGAN2(run_training.py)も終わりのほうに併記。

StyleGAN2を動かそうとしてたハズなんですが、まー動かない。run_training.pyを完走できない。
あまりによくわからないからひよってStyleGAN1に戻り、まずは動かす感覚を得ようじゃないか、と奔走する素人のお話。

 メイン参考文献:
http://blog.livedoor.jp/tak_tak0/archives/52409271.html

データセット作成は割愛。たいして詰まる要素ないはず。

Google Colabで動かすにあたってtrain.py編集必須っていうのにちょいとたまげた。けどどのみち編集必要な仕様ぽかったな。
Dataset. の項はコピペ&編集(うちのデータはresolution=256)させていただいて、Number of GPUs. はデフォルト行をコメント化、GPU1の最下行を適用。kimgは画像数÷1,000、だよね?

この編集を経て出るエラーがAssertionError.
あさーしょんとは朝ショ・・・ではなく主張とか言明といった意味らしい。それがどうにも意味わからずエラー名とstylegan検索で行き着いたのがこちらで注目したい回答がこれ。(google訳)

>> self.tfrecord_dir内に保持されているものはすべてディレクトリではないことを示しています

tfrecord_dirといえばtrain.pyで編集したなか(EasyDict()内)に含まれてた項目。
パスは合ってるはずだしちゃんとディレクトリのはずなのだが、うぅむ。
腑に落ちぬながらとりあえずtfrecord_dirにフルパス指定する。それで正常に動いた。

いや動くんかい!!

ちゃんとstyleganが作業ディレクトリになってたのに、どこを参照してたんだ。そういう問題でもないんだろうか。
しかしそーなるとStyleGAN2のrun_training.py実行したときの、「タスク名に許可されない文字が入ってるぜー」的なRuntime Errorは今回の問題と関係なさそうか……?


きれいにオチがついて明日へ希望をつなげることに。

おまけ:StyleGAN2

やはりrun_training.pyが完走できず困ってたのだが上記の翌日解決したので原因と対策を記す。

 原因:
Invalid task name. Probable reason: unacceptable characters in your submit_config.run_desc.
Task name must be accepted by the following regex: うんぬん

タスク名に許可されない文字が含まれる
・・・って言われてもタスク名なんて編集できないよーうわーん

が、おとといまでの私であった。
今日はそこまでひどいポンコツではないので、件のタスク名がどこから発生し、どこへ行くのか辿る。とりあえず上記エラーはsubmit.pyの一番下のほうで出されてるからそれより手前。
てか吐かれたエラーに含まれるスクリプトをチェックすればいい。というわけでrun_training.pyから探る。

kwargs.submit_config.run_desc = desc

ここでアレコレ繋いだdescが渡されてる。(ひいてはrun_desc = 実行元パスへ)
さてここでもう一度”許可されない文字”を振り返ってみよう。
許可されてるのは ^[a-zA-Z0-9][a-zA-Z0-9_.-]+$ だ。

うちは「content下の揮発性スペースへ何度もgit cloneするの、ストレージにやさしくないカナー」とgoogle drive上にclone保存することが多い。
しかしMy Driveまで読ませるとパス文字列にスペースが入ってしまう。
確かそれでこけたこともあったし、とcontent下へgit clone stylegan2してちっさいデータセット作っ実行・・・しても同じエラーでダメやんけ。

今一度拒否されたパスを見る。――ハイフン’-‘でつながってる部分があるの、なんでやろなァ。しかしハイフンは許可された文字列。
・・・スラッシュあかんのけ?

run_training.py119行でdescが渡される前に変換を実行。

desc = desc.replace('/', '-')

これで通していただけた。
一応確認のためにMy Drive上のstylegan2のtraining.pyからやってみたらスラッシュハイフン変換しても
RuntimeError: Invalid task name. Probable reason: unacceptable characters in your submit_config.run_desc. Task name must be accepted by the following regex: ^[a-zA-Z0-9][a-zA-Z0-9_.-]+$, got root-00002-stylegan2–content-drive-My Drive-stylegan-datasets-custom-dataset-1gpu-config-f
と通してもらえなかった。不可避スペースは害悪。

と思ったら半角スペースもハイフン’-‘にしてやったら通った。
replace()噛ませんでもrun_training.pyの引数–datasetへの指定で直接ハイフンにしてやったらいいのでは? てのもやってみたけどtfrecord_dirも同じ引数読むからダメでした。run_training.py内でdescだけreplace()するのがベストのよう。