2015-11-13 14 views
5

Sto provando a scrivere la mia funzione di costo in flusso tensoriale, ma a quanto pare non posso "tagliare" l'oggetto tensoriale?scrivendo una funzione di costo personalizzato in tensorflow

import tensorflow as tf 
import numpy as np 

# Establish variables 
x = tf.placeholder("float", [None, 3]) 
W = tf.Variable(tf.zeros([3,6])) 
b = tf.Variable(tf.zeros([6])) 

# Establish model 
y = tf.nn.softmax(tf.matmul(x,W) + b) 

# Truth 
y_ = tf.placeholder("float", [None,6]) 

def angle(v1, v2): 
    return np.arccos(np.sum(v1*v2,axis=1)) 

def normVec(y): 
    return np.cross(y[:,[0,2,4]],y[:,[1,3,5]]) 

angle_distance = -tf.reduce_sum(angle(normVec(y_),normVec(y))) 
# This is the example code they give for cross entropy 
cross_entropy = -tf.reduce_sum(y_*tf.log(y)) 

ottengo il seguente errore: TypeError: Bad slice index [0, 2, 4] of type <type 'list'>

risposta

6

Attualmente, tensorflow can't gather on axes other than the first - it's requested.

Ma per ciò che si vuole fare in questa situazione specifica, è possibile trasporre, quindi raccogliere 0,2,4, e quindi trasporre indietro. Non sarà veloce pazzo, ma funziona:

tf.transpose(tf.gather(tf.transpose(y), [0,2,4])) 

Si tratta di una soluzione utile per alcune delle limitazioni nell'implementazione corrente di raccogliere.

(ma è anche corretto che non è possibile utilizzare una porzione numpy su un nodo tensorflow - è possibile eseguirlo e tagliare l'output, e anche che è necessario inizializzare tali variabili prima di eseguire. :). Stai mescolando tf e np in un modo che non funziona.

x = tf.Something(...) 

è un oggetto grafico a flusso ridotto. Numpy non ha idea di come affrontare tali oggetti.

foo = tf.run(x) 

è tornato a un oggetto che python può gestire.

In genere si desidera mantenere il calcolo della perdita in tensorflow puro, così come la croce e altre funzioni in tf. Probabilmente dovrete fare il arccos alla lunga, dato che tf non ha una funzione per questo.

0

appena realizzato che quanto segue non è riuscito:

cross_entropy = -tf.reduce_sum(y_*np.log(y)) 

non puoi utilizzare le funzioni NumPy su oggetti TF, e l'indicizzazione mio essere diversa.

+1

questo non è il problema. Il problema è che le tue variabili non sono inizializzate. –

-1

Questo è perché non hanno inizializzato la variabile e per questo non ha il tuo Tensor c'è in questo momento (può leggere di più in my answer here)

Basta fare qualcosa di simile:

def normVec(y): 
    print y 
    return np.cross(y[:,[0,2,4]],y[:,[1,3,5]]) 

t1 = normVec(y_) 
# and comment everything after it. 

Per vedi che non hai un Tensore ora e solo Tensor("Placeholder_1:0", shape=TensorShape([Dimension(None), Dimension(6)]), dtype=float32).

Try inizializzare le variabili

init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

e valutare la variabile sess.run(y). Post scriptum non hai nutrito i tuoi segnaposto fino ad ora.

+0

Ho provato questi: sess.run (y) o sess.run (y_) entrambi danno errori. e l'inizializzazione delle variabili non sembrava aiutare. Anche quando li eseguo prima di creare la funzione di costo (questo non sembrava importare nello script di esempio qui riportato: http://tensorflow.org/tutorials/mnist/beginners/index.md – kmace

0

Penso che sia possibile utilizzare il metodo "Wraps Python function" in tensorflow. Ecco lo link della documentazione.

E per quanto riguarda le persone che hanno risposto "Perché non usi semplicemente la funzione incorporata di tensorflow per costruirlo?" - a volte la funzione di costo che la gente sta cercando non può essere espressa nelle funzioni di tf o estremamente difficile.

Problemi correlati