में कई tensors के कुशल कमी मैं चार बहुआयामी tensors v[i,j,k]
, a[i,s,l]
, w[j,s,t,m]
, Numpy में x[k,t,n]
है, और मुझे टेन्सर z[l,m,n]
द्वारा दिए गए गणना करने के लिए कोशिश कर रहा हूँ:अजगर
z[l,m,n] = sum_{i,j,k,s,t} v[i,j,k] * a[i,s,l] * w[j,s,t,m] * x[k,t,n]
सभी tensors हैं अपेक्षाकृत छोटा (कुल में 32k तत्व कम कहें), हालांकि मुझे इस गणना को कई बार करने की ज़रूरत है, इसलिए मैं चाहता हूं कि फ़ंक्शन जितना संभव हो उतना ऊंचा हो।
मैं numpy.einsum
इस तरह का उपयोग कर इसे लागू करने की कोशिश की:
z = np.einsum('ijk,isl,jstm,ktn', v, a, w, x)
लेकिन यह बहुत धीमी थी। s
और t
(दोनों s
और t
, बहुत छोटे होते हैं, इसलिए है कि एक समस्या की बहुत अधिक नहीं है) से अधिक योग करने के लिए
z = np.zeros((a.shape[-1],w.shape[-1],x.shape[-1]))
for s in range(a.shape[1]):
for t in range(x.shape[1]):
res = np.tensordot(v, a[:,s,:], (0,0))
res = np.tensordot(res, w[:,s,t,:], (0,0))
z += np.tensordot(res, x[:,s,:], (0,0))
पाश के लिए एक डबल के अंदर: मैं भी numpy.tensordot
कॉल की निम्न क्रम की कोशिश की। यह बहुत बेहतर काम करता है, लेकिन यह अभी भी उतना तेज नहीं है जितना मैं छोड़ दूंगा। मुझे लगता है कि यह उन सभी परिचालनों के कारण हो सकता है जो tensordot
को वास्तविक उत्पाद (उदाहरण के लिए अक्षों को अनुमति देने) से पहले आंतरिक रूप से प्रदर्शन करने की आवश्यकता है।
मैं सोच रहा था कि क्या इस तरह के संचालन को लागू करने के लिए एक और अधिक प्रभावी तरीका है। मैं साइथन में इस हिस्से को लागू करने पर भी ध्यान नहीं रखूंगा, लेकिन मुझे यकीन नहीं है कि उपयोग करने के लिए सही एल्गोरिदम क्या होगा।
क्या आप अपना 'numpy.einsum' और 'numpy.tensordot' कार्यान्वयन साझा कर सकते हैं? – Divakar
@ दिवाकर: सुनिश्चित करें। 'Einsum' कार्यान्वयन बस 'z = np.einsum (' ijk, isl, jstm, ktn ', v, a, w, x) है। 'Tensordot' कार्यान्वयन ' res = np.tensordot (v, a, (0,0)) res = np.tensordot (res, w, (0,0)) res = np.tensordot (res , एक्स, (0,0)) ' – Alessandro
कृपया प्रश्न के नीचे" संपादन "बटन का उपयोग करके उन कार्यान्वयन को प्रश्न में जोड़ें। – Divakar