2015-11-13 6 views
5

Ich versuche, meine eigene Kostenfunktion in Tensor-Flow zu schreiben, aber anscheinend kann ich das Tensor-Objekt nicht "schneiden"?Schreiben einer benutzerdefinierten Kostenfunktion 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)) 

bekomme ich folgende Fehlermeldung: TypeError: Bad slice index [0, 2, 4] of type <type 'list'>

Antwort

6

Derzeit Tensorflow can't gather on axes other than the first - it's requested.

Aber für was Sie in dieser spezifischen Situation tun möchten, können Sie transponieren, dann 0,2,4 sammeln und dann zurück transponieren. Es wird nicht verrückt schnell sein, aber es funktioniert:

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

Dies ist für einige der Einschränkungen in der aktuellen Implementierung von sammeln eine nützliche Abhilfe ist.

(Aber es ist auch richtig, dass Sie keine numpy Slice auf einem Tensorflow-Knoten verwenden können - Sie können es ausführen und die Ausgabe in Scheiben schneiden, und auch, dass Sie diese Variablen vor dem Ausführen initialisieren müssen. :). Sie mischen tf und np auf eine Weise, die nicht funktioniert.

x = tf.Something(...) 

ist ein Tensorflow-Diagrammobjekt. Numpy hat keine Ahnung, wie er mit solchen Objekten umgehen soll.

foo = tf.run(x) 

ist zurück auf ein Objekt Python verarbeiten kann.

Normalerweise möchten Sie Ihre Verlustberechnung in reinem Tensorflow behalten, also tun Sie das Kreuz und andere Funktionen in tf. Sie werden wahrscheinlich den Arcco auf lange Sicht tun müssen, da tf keine Funktion dafür hat.

0

gerade realisiert, dass die gescheiterte folgende:

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

Sie numpy Funktionen auf tf Objekte verwenden kann nicht, und die Indizierung meiner zu unterscheiden.

+1

das ist nicht das Problem. Das Problem ist, dass Ihre Variablen nicht initialisiert werden. –

-1

Dies ist, weil Sie Ihre Variable nicht initialisiert haben und aus diesem Grund es nicht Ihre Tensor jetzt hat es

Genau das tun, so etwas wie dieses (kann mehr in my answer here lesen):

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

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

zu sehen Sie, dass Sie jetzt keinen Tensor haben und nur Tensor("Placeholder_1:0", shape=TensorShape([Dimension(None), Dimension(6)]), dtype=float32).

Versuchen initialisiert die Variablen

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

und bewerten Sie Ihre Variable sess.run(y). P.S. Sie haben Ihre Platzhalter bisher nicht gefüttert.

+0

Ich habe versucht, diese: sess.run (y) oder sess.run (y_) beide geben Fehler. und die Initialisierung der Variablen schien nicht zu helfen. Selbst wenn ich sie vor dem Erstellen der Kostenfunktion ausführe (das schien im Beispielskript, das hier gegeben wird, keine Rolle zu spielen: http://tensorflow.org/tutorials/mnist/beginners/index.md – kmace

0

Ich denke, Sie können "Wraps Python-Funktion" -Methode in Tensorflow verwenden. Hier ist die link zur Dokumentation.

Und was die Leute angeht, die geantwortet haben: "Warum benutzt du nicht einfach die eingebaute Tensorflow-Funktion, um sie zu konstruieren?" - Manchmal kann die Kostenfunktion, nach der die Leute suchen, nicht in den Funktionen von tf ausgedrückt werden oder extrem schwierig.

Verwandte Themen