2017-05-29 89 views
0

我想對張量流中的每個輸入要素應用一個掩碼。如果掩模是固定的,這很容易實現 - 只需在圖形中定義並應用即可。抓住的是,我希望面罩在訓練過程中有所變化 - 每個訓練步驟都會略有不同。實際上,對於每一步,我都有一個函數返回一個代表每一步掩碼的numpy數組。Mask張量流輸入數據

經過大量的試驗和錯誤和搜索,我發現沒有辦法應用此掩碼 - 就我而言,這是不可能的,由tensorflow的屬性強制要求修復所有計算屬性時該圖是建立的。

但是,我對張量流很新,所以很有可能這是可行的,甚至很容易。誰能幫我?

僞代碼將是:

build graph with mask as placeholder 
    Loop over training steps 
     numpy_array = my_func(step_number) 
     mask_placeholder = something(numpy_array)* 
     Session.run([my graph(mask_placeholder)])* 

星星在哪裏,我不知道該怎麼辦。

回答

0

您需要添加屏蔽操作邏輯作爲TensorFlow graph的一部分。具體而言,control flow operators類似tf.logical_and,tf.logical_ortf.case允許您在運行模型時有條件地選擇所需的數據。

例如,下面的代碼顯示瞭如何基於兩個訓練數據或標籤輸入的狀態建立一個4元張量。你應該能夠對你的情況應用類似的邏輯。

def const_v(val): 
    return tf.constant(val, tf.float32) 

def const_1(): 
    return const_v(1) 

def const_0(): 
    return const_v(0) 

def cond_and(cond_1, cond_2, val_1, val_2): 
    return tf.logical_and(tf.equal(cond_1, val_1), 
          tf.equal(cond_2, val_2)) 

def vec4(c1, c2, c3, c4): 
    return [const_v(c1), const_v(c2), const_v(c3), const_v(c4)] 

# c1 c2 vector 
# 1 1 [1, 0 , 0 ,0] 
# 1 0 [0, 1, 0, 0] 
# 0 1 [0, 0, 1, 0] 
# 0 0 [0, 0, 0, 1] 

def combined_conditions(cond_1, cond_2): 
    return tf.stack(tf.case({cond_and(cond_1, cond_2, const_1(), const_1()): lambda: vec4(1, 0, 0, 0), 
        cond_and(cond_1, cond_2, const_1(), const_0()): lambda: vec4(0, 1, 0, 0), 
        cond_and(cond_1, cond_2, const_0(), const_1()): lambda: vec4(0, 0, 1, 0), 
        cond_and(cond_1, cond_2, const_0(), const_0()): lambda: vec4(0, 0, 0, 1) 
        }, default=lambda: vec4(0, 0, 0, 0), exclusive=True)) 
+0

林不知道這會做伎倆。讓我舉一個具體的例子。假設我的特徵是長度爲100,000的矢量。我用10萬步訓練。在每一步中,我想用掩碼向量中的1和0掩碼輸入要素,其中1的個數只是訓練步數。圖表不知何故必須知道這個數字,並在每一步創建一個新的面具。請注意,它所需的數字不能從輸入數據集本身收集。 –

+0

我從來沒有使用過它們,但看起來您可以從[Training Utility](https://www.tensorflow.org/versions/master/api_guides/python/train#Training_Utilities)函數中獲取培訓步驟 - - tf.train.get_global_step或tf.train.global_step。這加上圖形邏輯和一些聰明的Python可能會解決你的問題。 –

1

這看起來像只是numpy會很容易。事實上,我曾經有過一種情況,我想做一些對我而言似乎微不足道,但在張力流中很難做到的事情。具體而言,我想根據這些元素的值將一個數學函數應用於張量的某些元素。 EG:

array_a[array_a > 0] = np.log(array_a + 1)[array_a > 0]

換算成類似「A,其中A大於零,等於一加一的日誌,其中A是大於零」。

我沒有在tensorflow中成功,直到我發現了tf.py_func。據py_func在https://www.tensorflow.org/api_docs/python/tf/py_func的描述中,

「給定一個蟒函數func,這需要numpy的陣列作爲其輸入,並返回numpy的數組作爲其輸出端,包裝這個功能在一個TensorFlow圖形的操作。」

所以,這適用於你的情況,你可以不喜歡

def tf_mask(the_tensor,the_mask): 
    def np_mask(a,b): 
     return a[b] 
    return tf.py_func(np_mask, [the_tensor,the_mask], tf.float32) 

,或者如果你想保留陣列的形狀,像做

def tf_mask(the_tensor,the_mask): 
    def np_mask(a,b): 
     a[b == 0] = 0 
     return a 
    return tf.py_func(np_mask, [the_tensor,the_mask], tf.float32) 

總之,找一種方法在numpy中做,然後使用py_func。 Numpy功能非常強大,我們可以在Tensorflow中顯然使用這種功能,這真是太好了。