日々精進

新しく学んだことを書き留めていきます

画像のData Augmentationをする上での知見

  • Augmentationを実行するコードは関数にして、以下のパターンで呼び出せるようにする
    • Augmentationした画像をjpgファイルとして保存する。 これはAugmentation結果が想定通りかを確認するために使用する。
    • 学習時に動的にAugmentationする。kerasならfitでなくfit_generatorを使うようにし、generator関数を定義する。 これがAugmentationしてできたファイルの数があまり多くない場合やどうAugmentationするか試行錯誤する段階で使う。Augmentation結果を一旦ファイルに保存して、それを読み込んで学習する場合、Augmentationの仕方が変わると面倒なので。
    • Augmentationして出来た画像をTFRecord形式で保存する。 これはAugmentationの仕方が固まっていて速く学習させたい場合に使用する。動的にAugmentationするより一旦TFRecord形式で保存したものを読み込む方が5~10倍程度速かった。 あと、最初は画像をjpgファイルとして保存してたけど、10万枚ぐらい一つのフォルダに保存してたらWinSCPでそこ開くとアプリが固まるし、S3に置いたらjpgファイルのダウンロードだけで数時間かかるし・・と色々不便だった。
  • imgaugは便利なので使おう dev.classmethod.jp

現場からは以上です。

Linuxで環境変数を設定しようとすると「command not found」

具体的には CUDA_VISIBLE_DEVICES=0,1,2,3 python test.py & を実行すると command not found と言われて困った。 コマンドはあってるはずなのに。。原因は「CUDA_VISIBLE_DEVICES」の部分をブラウザからコピペしてきたんだけど、 その時に変な文字コードもコピペされていたことっぽい。そういえばペーストしたときターミナルの表示がおかしくなってたな。。 コマンドを手打ちして実行すると直った。

git fetchすると「error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol」または「error:1408F10B:SSL routines:ssl3_get_record:wrong version number」エラー

最初は error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol というエラーが出ていたが、gitを再インストールしたら error:1408F10B:SSL routines:ssl3_get_record:wrong version number に変わった。

原因はremoteリポジトリが社内にあるGitHub Enterprise Serverだったが、そこにアクセスする時に社内Proxyを経由してしまっていたこと。 社内のサーバが接続先なのでProxyを経由せず直接アクセスするようにしないといけなかった。 以下を.gitconfigに追加するとProxyを使わなくなり、直った。

[http]
    proxy = ""
[https]
    proxy = ""

この問題の調査をするときに curl --verbose https://xxx~ を実行するとProxyを経由していることが分かって役に立った。

参考:

qiita.com

github.com

kerasでfitした時に「tensorflow.python.framework.errors_impl.InvalidArgumentError: Reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are non-zero」エラー

直接の原因はエラーメッセージの通りemptyのTensorをreshapeしようとし、reshapeの引数に-1があったので reshape後のshapeが一意に決まらずエラーになったことだがなぜemptyのTensorをreshapeしようとしているのかはわからない。。 根本原因はよく分かって無いが、発生する条件は以下。

バッチサイズ:32 学習データサイズ:70

このときはエラーになるが、学習データサイズが25,80,124,128はいずれもエラーにならなかった。 学習データサイズはバッチサイズの倍数になるようにした方が無難っぽい。

参考:

stackoverflow.com

SourceTreeはGitHubEnterpriseServerに対応していない

昔はオンプレ環境用のGitHubサーバの名前はGitHub Enterpriseだった気がするんだけど、 今はGitHub Enterprise Serverというらしい。

github.com

SourceTreeでGitHub Enterprise Serverのアカウントを作ろうとしても作れない。 これは昔から要望としてはあるけど全然対応してくれないっぽい。まあ競合だからしょうがないか。。

Solved: Adding a github enterprise account to source tree

でもGitHub Enterprise ServerをRemoteリポジトリとして登録すると使えることもあるんだよな。。

kerasで保存したモデルを読み込んでpredictすると「Reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are non-zero」エラーが発生する

原因はmulti_gpu_modelを使った場合、multi_gpu_modelでwrapする前のモデルのsaveで保存しないといけないが、 wrap後のモデルのsaveを使っていたため。

↓はダメな例

parallel_model = multi_gpu_model(model)
...
parallel_model .save("path/to/save")

↓はOK

parallel_model = multi_gpu_model(model)
model.compile(...)
...
model.save("path/to/save")

parallel_model を使う場合でもmodel.compileは呼ばないといけない(model.saveはparallel_model.compileで登録した情報は保存してくれないため。)

参考:

keras.io

Pythonは実質シングルスレッド

Pythonでもthreadingモジュールを使うとスレッドを作れるが、グローバルインタプリタロック というものが存在し、 このロックを取っているスレッドだけがPythonオブジェクトを操作したりできるので実質常に一つのスレッドしか動いてない。 並行処理したかったらマルチプロセスにしないといけない。

参考:

docs.python.org

methane.hatenablog.jp

blog.bonprosoft.com