2017-05-17 38 views
1

Here,我讀了一些風格轉移的tensorflow實現。 具體而言,它定義了即將被優化的損失。在一個損失函數,它說: `風格轉移實現tensorflow

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。任何人都可以排除張量流邏輯,特別是爲什麼x包含輸入圖像(而不是樣式圖像)的特徵向量。對我而言,似乎有兩個並行的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

這對我來說很清楚。所以當'minim'實際運行時,它會調用丟失函數。在這裏,另一個運行開始,但仍然必須有最小化運行的狀態來獲得'x = net [layer]'。之前的語句,即'a = ...',也在同一層評估網絡,但不干擾'x = ...'。所以我的問題是tensorflow如何處理這種情況。是否有一個新的子圖構造? – user1225905

+0

該圖只構造一次...會話可根據所需輸出執行圖(子圖)的不同部分。您可以使用'tensorboard'來檢查子圖。看到一個例子[這裏](http://stackoverflow.com/questions/43830022/compute-gradient-norm-of-each-part-of-composite-loss-function/43944183#43944183)。 – Alex