2015-11-13 40 views
5

में एक कस्टम लागत फ़ंक्शन लिखना मैं टेंसर प्रवाह में अपना खुद का लागत फ़ंक्शन लिखने की कोशिश कर रहा हूं, हालांकि जाहिर है कि मैं टेंसर ऑब्जेक्ट को 'स्लाइस' नहीं कर सकता हूं?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)) 

मैं निम्नलिखित त्रुटि मिलती है: TypeError: Bad slice index [0, 2, 4] of type <type 'list'>

उत्तर

6

वर्तमान में, tensorflow can't gather on axes other than the first - it's requested

लेकिन आप इस विशिष्ट स्थिति में क्या करना चाहते हैं, इसके लिए आप ट्रांसफर कर सकते हैं, फिर 0,2,4 इकट्ठा कर सकते हैं, और फिर वापस स्थानांतरित कर सकते हैं। यह पागलपन तेजी से नहीं होगा, लेकिन यह काम करता है:

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

यह इकट्ठा की वर्तमान कार्यान्वयन में सीमाओं में से कुछ के लिए एक उपयोगी समाधान नहीं है।

(लेकिन यह भी सही है कि आप एक tensorflow नोड पर एक numpy टुकड़ा का उपयोग नहीं कर सकते हैं - आप इसे चला सकते हैं और आउटपुट टुकड़ा कर सकते हैं, और यह भी कि आप चलाने से पहले उन चर को शुरू करने की जरूरत है। :)। आप टीएफ और एनपी को ऐसे तरीके से मिला रहे हैं जो काम नहीं करता है।

x = tf.Something(...) 

एक tensorflow ग्राफ ऑब्जेक्ट है। Numpy को पता नहीं है कि इस तरह के वस्तुओं का सामना कैसे करें।

foo = tf.run(x) 

किसी ऑब्जेक्ट पाइथन को संभाल सकता है।

आप आमतौर पर शुद्ध टेंसफोर्लो में अपनी हानि गणना रखना चाहते हैं, तो टीएफ में क्रॉस और अन्य कार्यों को करें। आपको शायद लंबे समय तक आर्ककोस करना होगा, क्योंकि टीएफ के पास इसके लिए कोई फ़ंक्शन नहीं है।

0

सिर्फ महसूस किया कि निम्न विफल रहा:

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

आप नहीं कर सकते tf वस्तुओं पर numpy कार्यों का उपयोग, और अनुक्रमण भी अलग अलग हो सकती है।

+1

यह समस्या नहीं है। समस्या यह है कि आपके चर प्रारंभ नहीं किए गए हैं। –

-1

इसका कारण यह है कि आप अपने चर प्रारंभ नहीं किया गया है जाता है और इसी वजह से यह अभी आपकी टेन्सर नहीं है

बस कुछ इस तरह करते हैं (अधिक in my answer here पढ़ सकते हैं): करने के लिए

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

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

देखें कि अब आपके पास टेंसर नहीं है और केवल Tensor("Placeholder_1:0", shape=TensorShape([Dimension(None), Dimension(6)]), dtype=float32) है।

प्रयास आरंभ अपने चर

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

और मूल्यांकन अपने चर sess.run(y)। अनुलेख आपने अभी तक अपने प्लेसहोल्डर को खिलाया नहीं है।

+0

मैंने इन्हें आजमाया: sess.run (y) या sess.run (y_) दोनों त्रुटियां देते हैं। और चर के प्रारंभिक मदद करने के लिए प्रतीत नहीं होता था। यहां तक ​​कि जब मैं लागत समारोह बनाने से पहले उन्हें चलाता हूं (यह यहां दी गई उदाहरण स्क्रिप्ट में कोई फर्क नहीं पड़ता: http://tensorflow.org/tutorials/mnist/beginners/index.md – kmace

0

मुझे लगता है कि आप tensorflow में "Wraps Python function" विधि का उपयोग कर सकते हैं। दस्तावेज में link है।

और उन लोगों के लिए जिन्होंने उत्तर दिया "आप इसे बनाने के लिए फ़ंक्शन में निर्मित टेंसफोर्लो का उपयोग क्यों नहीं करते?" - कभी-कभी लागत वाले लोग टीएफ के कार्यों या बेहद मुश्किल में व्यक्त नहीं किए जा सकते हैं।