2017-05-17 12 views
7

मैं निम्नलिखित कोडथेनो स्विच पंक्ति-वार कुशलतापूर्वक

output = T.switch(cond, a, b) 

जहां cond एक (N,1) bool टेन्सर है, जबकि a और bM काफी बड़े होने के साथ (N, M) सांख्यिक Tensors हैं। स्थिति एक पंक्ति-वार तरीके से चलती है।

मैं T.repeat()cond पर आसानी से स्विच काम कर सकता हूं, लेकिन यह काफी धीमा है। a या b वापस लौटाया जाना चाहिए या नहीं, क्या कोई तरीका है कि मैं कुशलतापूर्वक cond में बूल बना सकता हूं?

उत्तर

3

क्या कोई तरीका है कि मैं कुशलतापूर्वक बूल को यह तय करने में सक्षम कर सकता हूं कि कोई या बी वापस किया जाना चाहिए या नहीं?

हाँ, तुम कर सकते हो

cond * a + (1-cond) * b 

cond(N, M) आकार के प्रसारित किया जाएगा।

यह सैद्धांतिक सीमा के करीब होना चाहिए, जो स्मृति बैंडविड्थ है: इस ऑपरेशन को N*M तत्वों को पढ़ने और N*M लिखने की आवश्यकता है।

इसके बजाय, हम 2*N*M पढ़ते हैं, लेकिन सशर्त तर्क को हटा दें।

(मैं मेरे सामने थेनो नहीं है, तो मुझे यकीन है कि नहीं कर रहा हूँ अगर यह T.switch की तुलना में तेजी है, लेकिन के रूप में यह हो जाता है। इसके अलावा इस बारे में के रूप में अच्छा होना चाहिए, मैं एक ही dtype कास्टिंग cond कोशिश करता हूँ a और b)


के रूप में आप में जगह a अद्यतन करना चाहते हैं, तो आप यह T.set_subtensor उपयोग कर सकते हैं:

a = np.random.uniform(size=(N, M)).astype(np.float32) 
b = np.random.uniform(size=(N, M)).astype(np.float32) 

a = theano.shared(a) 
b = theano.shared(b) 

c = T.vector() # mostly 0, presumably (1-cond) 

nz = T.nonzero(c) 

s = T.set_subtensor(a[nz], b[nz]) 
fn = theano.function([c], [], updates=[(a, s)]) 

... 

fn(1-cond) 

यह या तेज नहीं हो सकता टी N, M और अन्य कारकों के आधार पर पहला दृष्टिकोण हैन।

+0

उत्तर के लिए धन्यवाद, मैं इसे आज़माउंगा! सैद्धांतिक सीमा के बारे में दिलचस्प विचार। मुझे लगता है कि मैं बड़े पैमाने पर पढ़ने और लिखने से लिख सकता हूं कि अक्सर 'ए' वापस लौटने का सही मूल्य होगा और यह 'ए' को संशोधित करने के तरीके के लिए ठीक है। मान लीजिए कि किसी भी पंक्ति के लिए 'बी' का केवल 5% वापस किया जाना चाहिए, क्या संशोधन में आवश्यक पंक्तियों पर सीधे 'ए' को संशोधित करके बेहतर प्रदर्शन प्राप्त नहीं किया जा सकता है? – pir

+0

@pir क्या आप सीपीयू या जीपीयू के लिए अनुकूलित कर रहे हैं? सामान्य एन, एन और dtype क्या हैं? – MaxB

+0

@pir भी, एनएन का यह हिस्सा है या कुछ जो ढाल की जरूरत है? – MaxB

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