Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upconvモデルに於いての出力が毎回違う、など #41

Closed
2ji3150 opened this issue Jul 24, 2016 · 7 comments
Closed

Upconvモデルに於いての出力が毎回違う、など #41

2ji3150 opened this issue Jul 24, 2016 · 7 comments

Comments

@2ji3150
Copy link

2ji3150 commented Jul 24, 2016

*最近気づきましたが、UpConvを使うと、同じ画像で同じ設定で出力しても毎回の出力の容量が違います。
これは本家による仕様でしょうか。

*あと本家のUpcovにはnoise modelも入ってるんですが、waifu-caffeだとnoise_scaleだけが入ってます。これでUpconv モデルでノイズ除去だけする時modelをnoiseに指定してもnoise_scale modelにならないですか?

*ついでにお知らせとアドバイスです
→本家のupconvモデル三日前に更新された模様。
→本家の方のようにupcovモデルをデフォルトにするようにおすすめします、平均的に良くなるし、速くもなるので
→modelフォルダ階層を本家に合わせて頂けませんか、または更新のログも、ちょっと照合し辛いです。

つまりこのように:

┬ upconv_7
├art
└photo

┬ vgg_7
├art
├art_y
├photo
└ukbench

*CUIのコマンドはもっと洗練にするはできるでしょうか
例えば--tta <1|0>を→-t を入れるだけでttaモードになる
modelの指定も→
--model_root upconv_7(デフォルトでupcov) --model art
のはいかがでしょうか

よろしくお願いします

@2ji3150 2ji3150 changed the title Upconvモデルに於いての出力が毎回違う Upconvモデルに於いての出力が毎回違う、など Jul 24, 2016
@nagadomi
Copy link
Contributor

cuDNNを使っている場合に結果画像に少し差が出るとことがあると思います。
数値的には非常に小さな差*1なので見た目の違い少ないと思いますが、
たとえば、出力が100.4999...など100にするか101にするか迷う値があると、小さな差でもそこの丸め方が変わります。そういった値が出てくる確率も非常に小さいですが、たとえば1000x1000のRGB画像は3000000個という非常にたくさんの数値によって出来ているので、これくらい数があると数十個はそういった値が出てきます。

*1: 16bit画像でも差は最大で1だったので少なくとも1/65535以下だと思います。


もう少し詳細な話ですが、UpConvで使っているDeconvolutionはcuDNNには無い機能ですが、ConvolutionのForwardとBackwardを入れ替えることで実装できます。Torchやwaifu2x-caffeもこの実装だと思います。cuDNNはBackwardに非決定的なアルゴリズムがあるので*2、予測時にBackwardを使っていると予測結果も非決定的になってしまっているのだと思います。Deconvolutionのアルゴリズム選択で非決定的なものを選択しないようにすれば結果が変わらないようにできるかもしれませんが、確認はしていません。

*2: マニュアルにnon-deterministicと書いてあるもの。Atomic Operationを使っているかららしいです。(GPUのスレッドが終了する順によって演算の順序が変わるなど)

@lltcggie
Copy link
Owner

lltcggie commented Jul 24, 2016

Upconvモデルの出力が毎回違う

@nagadomi さんが書いてくださったようにcuDNNを使っている場合は仕様です。

Upconvにnoise modelが入っていない

本家の実装ではupconv_7のnoiseモデルはvgg_7nのnoiseモデルを参照するようになっています。
しかし、waifu2x-caffeでは実装の都合上noise_scaleモデルの結果を縮小してノイズ除去の結果としています。
なので、Upconvにnoiseモデルが入っていないのは仕様です。

本家モデルの更新

そのうち更新しておきます。

RGB modelのnoise0はまだ入れてないようです

RGBモデルのノイズ除去レベル0はこちらの環境では問題なく動作していますが、具体的にどのファイルが不足しているのでしょうか?

デフォルトをupcovモデルに

検討しておきます。

モデルフォルダの階層

Windowsではシンボリックリンクが期待通り動作するのかわからないのと、僕は後方互換性維持を重視しているので変更の予定はありません。

CUIのコマンド変更

基本的には本家のコマンドと合わせるつもりなのと、後方互換性維持のため変更の予定はありません。

更新のログも、ちょっと照合し辛いです

具体的にどこが見づらいのでしょうか?

@2ji3150
Copy link
Author

2ji3150 commented Jul 24, 2016

ご返事ありがとうございます。大体わかりました。

noise0が入ってないのは見間違いでした。すみません。

modelの更新について
具体的に言うと、更新コミットの情報です

例えばvgg_7のartのmodel 本家のほうが詳しく書いてて、
"Update pretrained models. support for yuv420 jpeg"
waifu2x-caffeでは"モデル更新"だけなので、同じかどうかが私にはちょっとわかりにくいです。

@lltcggie
Copy link
Owner

なるほど、コミットログの話でしたか。
モデルを更新するときは最新版のモデルでファイルを上書きして、差分が生じたら「モデル更新」としてコミットする、という手順を踏んでいます。
なので、それぞれのモデルの更新内容についてはさほど意識していません。(そもそも複数の更新内容を一括してコミットする場合もある)
あくまでコミット時に本家の最新版モデルと同期していれば良いという考えです。
というわけなのでコミットログの詳細についてはあまり期待しないでください…

@2ji3150
Copy link
Author

2ji3150 commented Jul 25, 2016

わかりました、ありがとうございます。

もうご質問していただいた件ですが
waifu2x-caffeのUpConv modelの2倍を超える拡大率の場合はどのように処理されますか?

例えばnoise1で4倍拡大でしたら
RGB(vgg_7)modeでは確かに noise1で除去して→拡大→拡大 になるんですよね

UpConv modelの場合、私の理解が間違ってなければ、
拡大とノイズ除去を一斉に処理できるんですよね。
とすると、UpRGBmodelで同じくnoise1で4倍拡大でしたら
waifu2x-caffeはnoise1除去して→拡大→拡大
それとも noise_scale(noise1除去及び2倍拡大)→拡大 というフローでしょうか? (後者のほうがいいな気がするんです。)

@lltcggie
Copy link
Owner

例えばノイズ除去で4倍拡大の場合だと
noise_scaleで2倍 → scaleで2倍
の手順で処理します。

@lltcggie
Copy link
Owner

lltcggie commented Aug 2, 2016

ver 1.1.7でモデルの更新とデフォルトで使用するモデルの変更を行いました。
なのでこのIssueは閉じます。

@lltcggie lltcggie closed this as completed Aug 2, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants