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)
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
Che sconfigge lo scopo del condizionale originale. Forse ho trovato una soluzione alternativa, per le mie variabili specifiche. – Beez
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