1
Here、私はスタイル転送のテンソルフローの実装を読んでいます。 具体的には、最適化する損失を定義します。 1つの損失関数では、それは言う: `スタイル転送の実装テンソルフロー
def sum_style_losses(sess, net, style_imgs):
total_style_loss = 0.
weights = args.style_imgs_weights
for img, img_weight in zip(style_imgs, weights):
sess.run(net['input'].assign(img))
style_loss = 0.
for layer, weight in zip(args.style_layers, args.style_layer_weights):
a = sess.run(net[layer])
x = net[layer]
a = tf.convert_to_tensor(a)
style_loss += style_layer_loss(a, x) * weight
style_loss /= float(len(args.style_layers))
total_style_loss += (style_loss * img_weight)
`
オプティマイザは、現在のセッションで呼び出されます。
optimizer.minimize(sess)
ので、セッションが稼働しているが、中に実行すると、forループでさらにrun
が呼び出されます。テンソルフローの論理を誰もがexlainできますか?特にx
には入力イメージの特徴ベクトルが含まれています(スタイルイメージではありません)。私にとっては、2つの並列があると思われます。runs
次のように
これは明らかです。したがって、 'minimize'が実際に実行されるとき、それは損失関数を呼び出します。ここでは別の実行が開始されますが、 'x = net [layer]'を得るための最小化子実行の状態がなければなりません。前の文、つまり 'a = ...'も同じ層でnetを評価しますが、 'x = ...'に干渉しません。だから私の質問はテンソルフローがこのような状況をどのように処理するのかということでした新しいサブグラフが構築されていますか? – user1225905
グラフは1回だけ作成されます...セッションは、必要な出力に応じてグラフ(サブグラフ)の異なる部分を実行できます。 'tensorboard'を使って部分グラフを調べることができます。例[here](http://stackoverflow.com/questions/43830022/compute-gradient-norm-of-each-part-of-composite-loss-function/43944183#43944183)を参照してください。 – Alex