2017-05-29 3 views
0

Ich möchte eine Maske auf jede Eingabe-Funktion in Tensorflow anwenden. Dies ist sehr einfach zu tun, wenn die Maske fest ist - definieren und anwenden Sie sie einfach in der Grafik. Der Haken ist, ich möchte, dass die Maske während des Trainings variiert wird - es wird für jeden Trainingsschritt etwas anders sein. Tatsächlich habe ich für jeden Schritt eine Funktion, die bei jedem Schritt ein numpiges Array zurückgibt, das die Maske darstellt.Maske Tensorflow Eingabedaten

Nach viel Versuch und Irrtum und Suche, habe ich keine Möglichkeit gefunden, diese Maske anzuwenden - soweit es mich betrifft, ist es unmöglich zu tun, durch die Eigenschaften von Tensorflow angewiesen, um alle Eigenschaften der Berechnung wann zu beheben Der Graph ist gebaut.

Allerdings bin ich ziemlich neu zu Tensorflow, so ist es sehr möglich, dass dies möglich ist, und sogar einfach. Kann mir jemand helfen?

Der Pseudo-Code wäre:

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)])* 

Die Sterne sind, wo ich nicht weiß, was zu tun ist.

Antwort

0

Sie müssen die Maskierungsoperationslogik als Teil der TensorFlow graph hinzufügen. Insbesondere control flow operators wie tf.logical_and, tf.logical_or und tf.case können Sie die gewünschten Daten bedingt wählen, wenn das Modell ausgeführt wird.

Zum Beispiel zeigt der folgende Code, wie ein 4-Elemente-Tensor basierend auf dem Status von zwei Trainingsdaten oder Label-Eingaben aufgebaut wird. Sie sollten in der Lage sein, eine ähnliche Logik auf Ihre Situation anzuwenden.

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

Ich bin nicht sicher, dass dies den Trick tun wird.Lassen Sie mich ein konkretes Beispiel geben. Angenommen, meine Features sind Vektoren mit einer Länge von 100.000. Ich trainiere mit 100.000 Schritten. Bei jedem Schritt möchte ich das Eingabemerkmal mit einem Maskenvektor aus Einsen und Nullen maskieren, wobei die Anzahl der Einsen nur die Trainingsschrittnummer ist. Der Graph muss diese Nummer irgendwie kennen und bei jedem Schritt eine neue Maske erstellen. Beachten Sie, dass die benötigte Anzahl nicht aus dem Eingabedatensatz selbst ermittelt werden kann. –

+0

Ich habe sie nie benutzt, aber es scheint, dass Sie den Trainingsschritt von einer der [Training Utility] (https://www.tensorflow.org/versions/master/api_guides/python/train#Training_Utilities) Funktionen bekommen können - - tf.train.get_global_step oder tf.train.global_step. Dies plus die Graphiklogik und etwas cleveres Python können Ihr Problem lösen. –

1

Dies scheint wie es wäre einfach mit nur numpy. In der Tat hatte ich eine Situation, in der ich etwas tun wollte, was mir im Tensorflow trivial, in der Anzahl aber schwierig erschien. Insbesondere wollte ich eine mathematische Funktion auf bestimmte Elemente eines Tensors basierend auf dem Wert dieser Elemente anwenden. Beispiel:

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

, die in etwa so übersetzt „A wobei A größer als Null ist das Protokoll der A gleich plus eins, wobei A größer als Null ist“.

Ich war nicht erfolgreich in Tensorflow, bis ich entdeckte tf.py_func. Nach der Beschreibung von py_func bei https://www.tensorflow.org/api_docs/python/tf/py_func,

„a Python Funktion func Gegeben, die numpy Arrays als seine Ausgänge numpy Arrays als Eingänge und gibt nimmt, wickeln diese Funktion als eine Operation in einer TensorFlow Graphen.“

Also, das auf Ihre Situation anwenden, könnten Sie so etwas wie

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) 

tun oder wenn Sie wollen die Form des Arrays zu erhalten, so etwas wie

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) 

Zusammenfassend, finden Sie einen Weg, es in numpy zu tun, und verwenden Sie dann py_func. Numpy ist ziemlich mächtig und es ist großartig, dass wir diese Kraft in Tensorflow offenbar einsetzen können.