2015-11-13 8 views
5

Próbuję napisać własną funkcję kosztu w przepływie tensora, ale najwyraźniej nie mogę "pokroić" obiektu tensora?pisanie funkcji kosztów niestandardowych w 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)) 

pojawia się następujący błąd: TypeError: Bad slice index [0, 2, 4] of type <type 'list'>

Odpowiedz

6

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

Ale za to, co chcesz zrobić w tej konkretnej sytuacji, możesz przetransponować, a następnie zebrać 0,2,4, a następnie przenieść z powrotem. To nie będzie szalony szybki, ale to działa:

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

Jest to przydatna obejście dla niektórych ograniczeń w bieżącej realizacji zbierać.

(Ale jest również poprawne, że nie można użyć plastra numpy na węźle tensorflow - można go uruchomić i wyciąć wyjście, a także, że trzeba zainicjować te zmienne przed uruchomieniem :). Mieszacie tf i np w sposób, który nie działa.

x = tf.Something(...) 

jest tensorflow Przedmiotem wykresu. Numpy nie ma pojęcia, jak sobie z tym poradzić.

foo = tf.run(x) 

powraca do obiektu, który może obsłużyć pyton.

Zazwyczaj chcesz zachować obliczanie strat w czystym tensorflow, więc wykonaj krzyż i inne funkcje w tf. Prawdopodobnie będziesz musiał wykonać arccos na dłuższą metę, ponieważ tf nie ma dla niego funkcji.

0

sobie sprawę, że te informacje nie powiodło się:

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

nie można korzystać z funkcji NumPy na tf obiektów, a indeksowanie moich być inna też.

+1

to nie jest problem. Problem polega na tym, że zmienne nie są inicjowane. –

-1

to dlatego, że nie zainicjowany zmienną i ze względu na to, że nie posiada swoją Tensor tam teraz (mogą więcej in my answer here)

Wystarczy zrobić coś takiego:

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

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

Aby zobacz, że nie masz Tensora teraz i tylko Tensor("Placeholder_1:0", shape=TensorShape([Dimension(None), Dimension(6)]), dtype=float32).

próbować inicjowania twoje zmienne

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

i ocenić zmienna sess.run(y). P.S. do tej pory nie karmiłeś swoich nosicieli.

+0

Próbowałem tych: sess.run (y) lub sess.run (y_) zarówno dają błędy. a inicjalizacja zmiennych nie wydaje się pomagać. Nawet jeśli uruchomię je przed utworzeniem funkcji kosztowej (nie miało to znaczenia w przykładowym skrypcie podanym tutaj: http://tensorflow.org/tutorials/mnist/beginners/index.md – kmace

0

Myślę, że można użyć metody "Wraps Python function" w tensorflow. Oto link do dokumentacji.

A co do ludzi, którzy odpowiedzieli "Dlaczego po prostu nie użyjecie wbudowanej funkcji tensorflow do zbudowania?" - czasami funkcja kosztu, której szukają ludzie, nie może być wyrażona w funkcjach TF lub jest wyjątkowo trudna.