2016-01-23 29 views
11

Come si crea un'istruzione if utilizzando un tensore booleano? Per essere più precisi, sto cercando di confrontare un tensore di dimensione 1 con una costante, controllando se il valore nel tensore è inferiore alla costante. Ho capito che devo rendere costante il suo tensore 1 e utilizzare il metodo this per verificare se il primo tensore è inferiore al secondo tensore, ma non sono sicuro di come rendere il tensore booleano risultante correttamente inserito in un'istruzione if . Inserendo semplicemente la query per l'istruzione if, se l'istruzione restituisce sempre true.Come creare un'istruzione if usando un Tensore booleano

MODIFICA: Questo è più o meno l'aspetto del codice. Tuttavia, sto ricevendo l'errore 'bool' object has no attribute 'name' indipendentemente dal fatto che abbia o meno parametri, il che mi fa pensare che il problema sia che non sta restituendo un oggetto TensorFlow.

pred = tf.placeholder(tf.bool) 

def if_true(x, y, z): 
    #act on x, y, and z 
    return True 

def if_false(): 
    return False 

# Will be `tf.cond()` in the next release. 
from tensorflow.python.ops import control_flow_ops 
from functools import partial 
x = ... 
y = ... 
z = ... 

result = control_flow_ops.cond(pred, partial(if_true, x, y, z), if_false) 
+1

Credo che sia necessario restituire oggetti 'Tensor' dal' if_true' e ' if_false' funziona. Questi possono essere semplicemente 'tf.constant (True)' e 'tf.constant (False)' rispettivamente.Se le tue azioni su 'x',' y' e 'z' hanno effetti collaterali, assicurati di aggiungere una dipendenza di controllo su di esse al tensore restituito, altrimenti potrebbero non essere eseguite. – mrry

+0

Che sconfigge lo scopo del condizionale originale. Forse ho trovato una soluzione alternativa, per le mie variabili specifiche. – Beez

+0

Hmm, se ottenere l'output come 'Tensor' non soddisfa le tue esigenze, allora presumo che tu non stia fornendo il risultato a un ulteriore sottotitolo di TensorFlow. In tal caso, potrebbe essere più semplice usare 'sess.run()' e una semplice istruzione 'If' di Python. – mrry

risposta

22

TL; DR: È necessario utilizzare Session.run() per ottenere un valore booleano Python, ma ci sono altri modi per raggiungere il stesso risultato che potrebbe essere più efficiente.

Sembra che hai già capito come ottenere un tensore booleano dal tuo valore, ma a beneficio di altri lettori, sarebbe simile a questa:

computed_val = ... 
constant_val = tf.constant(37.0) 
pred = tf.less(computed_val, constant_val) # N.B. Types of the two args must match 

La parte successiva è come usarlo come un condizionale. La cosa più semplice da fare è quella di utilizzare un Python if dichiarazione, ma per fare questo è necessario valutare tensore pred utilizzando Session.run():

sess = tf.Session() 

if sess.run(pred): 
    # Do something. 
else: 
    # Do something else. 

Un avvertimento su come utilizzare una dichiarazione di Python if è che si deve valutare la intera espressione fino a pred, il che rende difficile riutilizzare i valori intermedi che sono già stati calcolati. Vorrei attirare la vostra attenzione su altri due modi per calcolare espressioni condizionali usando TensorFlow, che non richiede di valutare il predicato e ottenere un valore di Python.

Il primo modo utilizza il tf.select() op di passare condizionale attraverso valori di due tensori passate come argomenti:

pred = tf.placeholder(tf.bool) # Can be any computed boolean expression. 
val_if_true = tf.constant(28.0) 
val_if_false = tf.constant(12.0) 
result = tf.select(pred, val_if_true, val_if_false) 

sess = tf.Session() 
sess.run(result, feed_dict={pred: True}) # ==> 28.0 
sess.run(result, feed_dict={pred: False}) # ==> 12.0 

Il tf.select() op lavora elemento-saggio su tutti i suoi argomenti, che consente di combinare i valori da i due tensioni di ingresso. Vedi its documentation per maggiori dettagli. Lo svantaggio di tf.select() è che valuta sia val_if_true e val_if_false prima di calcolare il risultato, che potrebbe essere costoso se si tratta di espressioni complicate.

Il secondo modo utilizza l'op tf.cond(), che valuta condizionatamente una delle due espressioni. Ciò è particolarmente utile se le espressioni sono costose ed è essenziale se esse sono have side effects. Il modello di base è quella di specificare due funzioni Python (o le espressioni lambda) che costruiscono sottografi che verranno eseguiti sui rami vere o false:

# Define some large matrices 
a = ... 
b = ... 
c = ... 

pred = tf.placeholder(tf.bool) 

def if_true(): 
    return tf.matmul(a, b) 

def if_false(): 
    return tf.matmul(b, c) 

# Will be `tf.cond()` in the next release. 
from tensorflow.python.ops import control_flow_ops 

result = tf.cond(pred, if_true, if_false) 

sess = tf.Session() 
sess.run(result, feed_dict={pred: True}) # ==> executes only (a x b) 
sess.run(result, feed_dict={pred: False}) # ==> executes only (b x c) 
+0

C'è un modo per far sì che una di quelle funzioni nel .cond abbia parametri? Voglio che if_true abbia 3 parametri, ma non riesco a capire come passare attraverso. Se uso partial o lambda, mi dice che l'oggetto bool non ha nome attributo, che sospetto provenga da Tensorflow che sta tentando di creare il grafico. Oh, e il mio if_true e if_false stanno restituendo un valore booleano, motivo per cui è un oggetto bool. – Beez

+0

Le funzioni 'if_true' /' if_false' non dovrebbero avere parametri, ma è possibile acquisire valori dall'ambito di inclusione. Non sono sicuro di avere una buona immagine del tuo codice dal tuo commento, quindi forse sarebbe meglio aggiornare la tua domanda con la versione corrente. – mrry

+0

Modificato con il nuovo codice. Ho provato a spostare le informazioni che coinvolgono i parametri fuori dalla funzione e in una normale istruzione if, e sto ricevendo lo stesso errore, quindi il problema deve essere perché non sto restituendo un oggetto TensorFlow. Il problema è che le informazioni che dipendono da questo booleano non si trovano in un oggetto TensorFlow. – Beez

1

uso reshape(t, []) per ottenere il valore e l'uso che in se-dichiarazione

Problemi correlati