3)とすればいいだけです。これは最終層が3×3解像度で、バッチサイズが512のケースです。色空間変換この問題では、白黒画像の自動着色を行っているので、一般的なRGB色空間よりも、明るさと色差を分離したYCrCb色空間を経由したほうがより直接的な訓練ができるようになります。PyTorchでの色空間変換はこちらを参照してください。PyTorchで行列(テンソル)積としてConv2dを使うhttps://blog.shikoan.com/conv2d-matmul/また、GやDで「YCrCb色空間」といったときは特に断りがなければYもCrCbも-1~1スケールです。本来のYCrCb色空間ではYは0~1、CrCbは-0.5~0.5のスケールです。詳細は末尾のコードを見てください。D:RGB色空間(成功例)一番うまく行った(と思われる)例です。序盤からかなり早く着色が進みます。これは色空間変換の効果です(特に、NonGANのただのU-Netだと顕著な傾向があります)。画像データはもともRGB色空間ですが、Gに食わせる前にYCrCbへの色空間の変換を行います。Gの入力をYCrCbのY・出力をCrCbとします。その後、Gの入力のYと出力のCrCbを足し合わせた画像を偽画像として、RGB色空間に戻します。Dの本物/偽物の判別はRGB色空間で行います。DとGの損失推移です。Dの損失がゆるやかに減少し、Gの損失がゆるやかに増加しているのがわかります。Entropyだけが増えているのがわかります。これは通常のDCGANでも見られる現象です。D:YCrCb色空間(着色がおかしい?)次にDの色空間をRGB色空間ではなく、YCrCb色空間とします。エラー推移は先程と変わりませんが、着色がどうも違和感があります。CrCb(赤と青の色差)で見ているので、赤と青のモヤっとした部分が目立つようになります。Dの色空間はRGBのほうがよさそうです。D:RGB色空間+グレースケール画像(Dが強くなりすぎてうまくいない)これはGもDもRGB色空間で行う例です。Gの入力はRGB色空間から生成したグレースケール画像、出力はRGB色空間のカラー画像としています。Dの入力はRGB色空間のカラー画像です。Pix2pixの論文で読むと「Gの入力をDの入力に再度入れなさい」と書いているので、Gで使ったグレースケールの画像をDの入力に入れ、Dの入力は4チャンネルとなっています。ここは議論の余地があると思います。もとのRGB色空間から生成したグレースケールの画像は、RGB画像についての関数だから、DにRGB画像を入れた時点で既にグレースケールの成分は入っているPix2pixの論文の定義にしたがってDにもRGB画像とグレースケールの両方を入れるべきだという2つの考え方があるからです。このケースでは(2)を選択しました。(1)も後ほど試してみます。このケースでは訓練が安定しませんでした。Dのロスが低くなりすぎる(強くなりすぎる)と、以降Dのロスが振動して暴れだします。途中まで上手く行っていたが、どれも似たようなセピア調の着色になってしまう、着色が失われてしまいます。D:RGB色空間(まあまあうまくいく)順番は前後してしまいましたが、これが最初に試したケースです。Dにグレースケールの画像を入れません(チャンネル数は3です)。先程の(1)の考えた方です。結果はまあまあうまくいきました。GをYCrCbにしたケースとどっちが着色がいいかは好みがあるでしょう。このケースでは、Gの入力であるグレースケールの画像を、Dに入れないほうがうまくいきました。補足事項ですが、Gの色空間を変えた場合はGの損失関数を以下のように変えています。RGB色空間でのL1損失YCrCb色空間でRGBのL1損失を入れている理由は、Non-GANの場合に、YCrCbだけの損失関数だと、白や黒に近いような場所で極端な着色になってしまうからです。それを打ち消すためにRGB色空間でのL1損失を入れています。まとめpix2pixを実装できました。手軽にできて学習も安定してるし、結果もそれっぽいのでコスパはかなり高そうです。細かい話だと、白黒画像のカラー化の場合はDもGもRGB色空間か、GがYCrCbでDがRGB色空間がよさそうです。コード全てGistに上がってます。訓練時間は2080Tiが2枚で5時間程度でした。エポック間に謎の間が20~30秒あってここが短縮できればもっと高速になるはずです。GもDも色空間がRGB。Dがグレースケールありの例。なしの場合はtorch.cat等を外せばいいだけなので、やっていることが理解できていればいじれるはずです。GがYCrCbで、DがRGBのケースです。成功例として紹介したのがこちら。Commentコメントをキャンセルメールアドレスが公開されることはありません。