2017-05-17 23 views
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次のように

答えて

0

GitHubのレポからのコードは次のとおり

init_op = tf.global_variables_initializer() 
sess.run(init_op) 
sess.run(net['input'].assign(init_img)) 
optimizer.minimize(sess) 

sessionスケジュール操作がデバイス上で実行し、いくつかの変数を保持します。異なる(サブ)グラフ間で多くの操作をスケジュールするために使用できます。したがって、セッション上のコード

  1. 変数を初期化します。
  2. シンボリック入力テンソルに画像を割り当てます。これについてはuse feedsにも注意してください。
  3. scipyのオプティマイザを使用して最小化します(既にコンストラクタで損失が発生しています...詳細はhereを参照)。

セッションは、そのステージで発生する計算を可能にするサブグラフの実行をスケジュールする役割を担います。

+0

これは明らかです。したがって、 'minimize'が実際に実行されるとき、それは損失関数を呼び出します。ここでは別の実行が開始されますが、 'x = net [layer]'を得るための最小化子実行の状態がなければなりません。前の文、つまり 'a = ...'も同じ層でnetを評価しますが、 'x = ...'に干渉しません。だから私の質問はテンソルフローがこのような状況をどのように処理するのかということでした新しいサブグラフが構築されていますか? – user1225905

+0

グラフは1回だけ作成されます...セッションは、必要な出力に応じてグラフ(サブグラフ)の異なる部分を実行できます。 'tensorboard'を使って部分グラフを調べることができます。例[here](http://stackoverflow.com/questions/43830022/compute-gradient-norm-of-each-part-of-composite-loss-function/43944183#43944183)を参照してください。 – Alex

関連する問題