したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

CS 20SI: Tensorflow for Deep Learning Research

22karino2:2017/05/23(火) 10:54:42
deepdreamは講義資料にはアルゴリズムの具体的な話が無さそう。
で、実装せよ、とソースには書いてある。
以前見たGoogleの間の層の可視化の話だよな。

https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html

とりあえずまずはコードをJupyter Notebookで触ってみるか。

23karino2:2017/05/23(火) 11:50:22
この課題は自分で解いてみる、というより、問題と解答の差分の所を見て、アルゴリズムを理解する、という感じだな。
Jupyter Notebookに移してTensorflowの最新バージョン用にちょこちょこコード直して動かすのはあっさり動く。
間の中間変数などをprintしたりして挙動を調べる。

24karino2:2017/05/23(火) 12:07:03
まずGraphDefという物があって、これがメモリ上にグラフ構造を保持する為のデータ構造っぽい。
それをimport_graph_defとやると、現在のグラフとして読み込む。この時にPlaceholderに値をフィードするっぽいが、入力の名前がたぶんこのモデルは"input"なのかな。
これはimageから117引いた結果としている。

で、間のレイヤーのweightを取り出して、このweightのmeanに対するinput_imageのgradientを求めている。
つまり、入力のピクセルをちょっとずらしたらweightの平均がどう反応するか、というのを見ている訳だ。
で、以下のようにしているのだから、

image_gradient /= image_gradient.std() + 1e-8
image += image_gradient * step_scale

勾配を登っていく訳だから、より画像をちょっと動かすと重みが増えるように画像を更新していく訳だ。
一番良く重みが反応するような画像、というのはどういう意味かなぁ。


いや、違うな。scoreが増えていっているという事は、 get_layer(layer)[:, :, :, channel]の結果は重みじゃなくて、それを適用した結果のテンソルか。
それの平均が最大って事は、このレイヤーまで来た値が最も強く反応するような画像を生成している訳か。

25karino2:2017/05/23(火) 14:26:04
style transferやるぞ!(゚Д゚)ゴルァ!

26karino2:2017/05/23(火) 14:43:52
avgpoolを実装せい、と言われる。ふむ、言われてみるとどう実装したらいいんじゃろ?
と見てみると普通にavg_poolあるじゃん。
これを呼ぶだけで良いのは分かるのだが、せっかくなので実装も覗いてみるかな。

27karino2:2017/05/23(火) 14:45:16
覗いてみたが、gen_nn_ops._avg_poolが呼ばれているだけで

https://github.com/tensorflow/tensorflow/blob/r1.1/tensorflow/python/ops/nn_ops.py

こいつは自動生成されるスタブらしい。

https://stackoverflow.com/questions/41147734/looking-for-source-code-of-from-gen-nn-ops-in-tensorflow

じゃあここから先を追う気は起こらないな。

28karino2:2017/05/23(火) 14:56:45
vgg_model_sols.pyの方に答えが書いてあるのか。
自分の結果と比べるとスコープとかを使っているね。
ふむ、以後真似しよう。

29karino2:2017/05/23(火) 16:21:04
答えをチラ見しつつcreate_summaryまでは順調に来た所で、summaryってなんぞ?と手が止まる。

Managing experiments and process dataの所のスライドにありそうだな。

30karino2:2017/05/23(火) 16:21:56
後半はほとんど写経になってしまったが、一応一通り理解はした。
さて、このまま実行すればいいのだろうけど、やっぱりnotebookで実行したいので移していくかなぁ。

31karino2:2017/05/23(火) 17:33:32
notebookで一通り動かしてみた。
10分くらいかかったかもしれないが、まぁこの位ならCPUでいいか、という所。

いろいろ触って大分経験値は上がったな。よしよし。

32karino2:2017/05/23(火) 21:56:24
さて、中をちゃんと追っておこう。
vgg_model.pyのload_vggでは、vgg_layersにモデルのパラメータを読み込み、この値をconstとして、同じ作りのネットワークを作っている。

次にlossの方を見ると、なんだか分からず我らが実装させられたのは、特定のレイヤーのアウトプットである事がわかる。
スタイルっぽいレイヤの値を、STYLE_LAYERSに入ってる名前のレイヤーの中間出力とみなす。
コンテント自身はconv4_2の中間出力をそれとみる。

さて、中間層の値は三回predictを実行する事で得る。

1. input_image
2. style_image
3. generated_image (これはN回)

1の中間層の値と2の中間層の値にいい感じに一致するようにgenerated_imageをいじっていく。
これはAdamOpmizerで更新される(!!!)

こんな感じか。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板