2016-11-05 3 views
1

Ich möchte jeden anderen Wert entlang einer bestimmten Dimension eines Tensors maskieren, sehe aber keinen guten Weg, eine solche Maske zu erzeugen. Zum BeispielBinäre Maske in Tensorflow

#Masking on the 2nd dimension 
a = [[1,2,3,4,5],[6,7,8,9,0] 
mask = [[1,0,1,0,1],[1,1,1,1,1]] 
b = a * mask #would return [[1,0,3,0,5],[6,0,8,0,0]] 

Gibt es eine einfache Möglichkeit, eine solche Maske zu generieren?

Im Idealfall würde Ich mag so etwas wie die folgenden Funktionen ausführen:

mask = tf.ones_like(input_tensor) 
mask[:,::2] = 0 
mask * input_tensor 

Aber Scheibe Zuordnung nicht so einfach wie in Numpy zu sein scheint.

Antwort

1

Sie können eine solche Tensormaske einfach mit Python programmatisch erstellen. Dann wandle es in einen Tensor um. In der TensorFlow-API gibt es keine solche Unterstützung. tf.tile([1,0], num_of_repeats) könnte eine schnelle Möglichkeit sein, eine solche Maske zu erstellen, aber nicht so toll, wenn Sie eine ungerade Anzahl von Spalten haben.

(Btw, wenn Sie eine boolean Maske am Ende der Schaffung verwenden tf.boolean_mask())

+0

Ich kann in meinem Fall guaruntee, dass die Dimension ich eine gerade Anzahl von Elementen maskieren will so die perfekt funktioniert. Vielen Dank! –

+3

Ich glaube nicht, dass tf.boolean_mask() die Dimensionen des ursprünglichen Tensors beibehält. Es gibt vielmehr die nicht maskierten Elemente in 1-d-Form zurück. –

1

Derzeit Tensorflow does not support numpy artige Zuordnung. Hier

ist ein paar Lösungen:

tf.Variable

tf.Tensor kann nicht geändert werden, aber tf.Variable kann.

a = tf.constant([[1,2,3,4,5],[6,7,8,9,10]]) 

mask = tf.Variable(tf.ones_like(a, dtype=tf.int32)) 
mask = mask[0,1::2] 
mask = tf.assign(mask, tf.zeros_like(mask)) 
# mask = [[1,0,1,0,1],[1,1,1,1,1]] 

tf.InteractiveSession() 
tf.global_variables_initializer().run() 
print(mask.eval()) 

tf.sparse_to_dense()

indices = tf.range(1, 5, 2) 
indices = tf.stack([tf.zeros_like(indices), indices], axis=1) 
# indices = [[0,1],[0,3]] 
mask = tf.sparse_to_dense(indices, a.shape, sparse_values=0, default_value=1) 
# mask = [[1,0,1,0,1],[1,1,1,1,1]] 

tf.InteractiveSession() 
print(mask.eval()) 
+0

Tatsächlich beantwortet dies die OP-Frage nicht. Sie fragten, wie man eine solche Maske programmatisch generiert *. – Multihunter

+0

@Multihunter, behoben. – AlexP