2016-06-20 20 views
6

में एक ओप लिखना मैं पाइथन में एक ओप लिखना चाहता हूं। यह ट्यूटोरियल केवल यह बताता है कि इसे पाइथन रैपर के साथ सी ++ में कैसे किया जाए। https://www.tensorflow.org/versions/master/how_tos/adding_an_op/index.html#adding-a-new-opटेन्सफोर्लो: पायथन

मैं इसे पाइथन में पूरी तरह से कैसे लिख सकता हूं?

उत्तर

11

आप tf.py_func(func, inp, Tout) का उपयोग कर सकते हैं।

एक पायथन फ़ंक्शन लपेटता है और इसे टेंसफोर्लो सेशन के रूप में उपयोग करता है।

एक पायथन फ़ंक्शन func को देखते हुए, जो इसके इनपुट के रूप में numpy arrays लेता है और इसके आउटपुट के रूप में numpy arrays देता है।


आपका अजगर समारोह की जरूरत है:

इनपुट के रूप में
  • NumPy सरणी, तर्क आउटपुट के रूप में inp
  • NumPy सरणी के साथ ग्राफ से तंग आ गया है, तो आप करने के लिए अपने प्रकार निर्दिष्ट करने की आवश्यकता Tout

फ़ंक्शन के अंदर, आप जो भी कर सकते हैं कहां, अगर लूप के लिए शर्तें, कुछ भी जो टेंसरफ्लो में संभव नहीं है।


हालांकि, आपरेशन CPU पर निष्पादित किया जाएगा तो यह GPU में बराबर TensorFlow सेशन की तुलना में धीमी हो सकती है।

+0

मैं कैसे GPU पर कार्य पूरे कर सकते: उदाहरण के लिए, हम एक Op और विशुद्ध रूप से अजगर में अपनी ढाल जो GPU पर Caffe कॉल जोड़ सकते हैं? क्या मुझे सी ++ पर इस जीपीयू संस्करण को लागू करना है? क्या Python में कोड लिखने का कोई तरीका है? –

+0

मुझे नहीं लगता कि पाइथन में GPU ऑपरेशन लिखने का कोई तरीका है। आप हमेशा ध्यान में रखे गए कार्यान्वयन के साथ एक और प्रश्न खोलने का प्रयास कर सकते हैं और कोई व्यक्ति सीधे इसे टेंसरफ्लो में लागू करने के विचार के साथ आ जाएगा। –

6

आप पाइथन कार्यों को कॉल करने के लिए tf.py_func का उपयोग कर सकते हैं। समारोह के अंदर संचालन GPU पर भी हो सकता है।

def custom_loss_impl(x): 
    caffe.set_mode_gpu() 
    caffe.set_device(0) 
    ... 
    return np.float32(loss) 

def custom_loss(x): 
    tf.RegisterGradient("custom_loss_grad")(custom_loss_grad) 
    g=tf.get_default_graph() 
    with g.gradient_override_map({"PyFunc":"custom_loss_grad"}): 
     return tf.py_func(custom_loss_impl,[x],[tf.float32])[0] 

def custom_loss_grad_impl(x): 
    caffe.set_mode_gpu() 
    caffe.set_device(0) 
    custom_loss_impl(x) 
    ... 
    return np.float32(gradient) 

def custom_loss_grad(op,grad): 
    x=op.inputs[0] 
    return tf.py_func(custom_loss_grad_impl,[x],[tf.float32])#assume grad=1 
+3

इस दृष्टिकोण के साथ, और यह मानते हुए कि आपका बाकी tensorflow ग्राफ GPU पर है, आपका डेटा tensorflow GPU -> CPU -> कैफे GPU -> CPU -> tensorflow GPU को फिर से ले जाएगा ..... – Dougal

संबंधित मुद्दे