सीधे शब्दों में कहें, torch.Tensor.view()
जो प्रेरित है numpy.ndarray.reshape()
या numpy.reshape()
, टेंसर का एक नया दृष्टिकोण बनाता है , जब तक कि नया आकार मूल टेंसर के आकार के साथ संगत हो।
आइए इसे एक ठोस उदाहरण का उपयोग करके विस्तार से समझें।
In [43]: t = torch.arange(18)
In [44]: t
Out[44]:
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])
t
आकार के इस दशांश के साथ (18,)
, नए विचार केवल निम्नलिखित आकृतियों के लिए बनाए जा सकते हैं:
(1, 18)
या समतुल्य (1, -1)
या या समकक्ष या या समकक्ष या या समकक्ष या या समकक्ष या या समकक्ष या(-1, 18)
(2, 9)
(2, -1)
(-1, 9)
(3, 6)
(3, -1)
(-1, 6)
(6, 3)
(6, -1)
(-1, 3)
(9, 2)
(9, -1)
(-1, 2)
(18, 1)
(18, -1)
(-1, 1)
जैसा कि हम पहले से ही उपरोक्त आकार के टुपल्स से देख सकते हैं, आकार टपल के तत्वों का गुणा (जैसे 2*9
, 3*6
आदि) हमेशा मूल टेंसर में तत्वों की कुल संख्या के बराबर होना चाहिए ( 18
हमारे उदाहरण में)।
निरीक्षण करने के लिए एक और बात यह है कि हमने -1
प्रत्येक आकार के टुपल्स में से एक में एक जगह का उपयोग किया । -1
A का उपयोग करके , हम स्वयं संगणना करने में आलसी हो रहे हैं और कार्य के लिए PyTorch को उस आकार की गणना करने के लिए कार्य सौंपते हैं जब वह नया दृश्य बनाता है । ध्यान देने वाली एक महत्वपूर्ण बात यह है कि हम केवल एक ही -1
आकार में टपल का उपयोग कर सकते हैं । शेष मूल्यों को हमारे द्वारा स्पष्ट रूप से आपूर्ति की जानी चाहिए। Else PyTorch फेंकने से शिकायत करेगा RuntimeError
:
RuntimeError: केवल एक आयाम का अनुमान लगाया जा सकता है
इसलिए, उपरोक्त सभी आकृतियों के साथ, PyTorch हमेशा मूल टेंसर का एक नया दृश्य लौटाएगा t
। मूल रूप से इसका मतलब है कि यह केवल अनुरोध किए गए नए विचारों में से प्रत्येक के लिए टेंसर की कठोर जानकारी को बदलता है।
नीचे कुछ उदाहरण दिए गए हैं जो बताते हैं कि प्रत्येक नए दृश्य के साथ टेंसर्स के तारों को कैसे बदला जाता है ।
# stride of our original tensor `t`
In [53]: t.stride()
Out[53]: (1,)
अब, हम नए विचारों के लिए प्रगति देखेंगे :
# shape (1, 18)
In [54]: t1 = t.view(1, -1)
# stride tensor `t1` with shape (1, 18)
In [55]: t1.stride()
Out[55]: (18, 1)
# shape (2, 9)
In [56]: t2 = t.view(2, -1)
# stride of tensor `t2` with shape (2, 9)
In [57]: t2.stride()
Out[57]: (9, 1)
# shape (3, 6)
In [59]: t3 = t.view(3, -1)
# stride of tensor `t3` with shape (3, 6)
In [60]: t3.stride()
Out[60]: (6, 1)
# shape (6, 3)
In [62]: t4 = t.view(6,-1)
# stride of tensor `t4` with shape (6, 3)
In [63]: t4.stride()
Out[63]: (3, 1)
# shape (9, 2)
In [65]: t5 = t.view(9, -1)
# stride of tensor `t5` with shape (9, 2)
In [66]: t5.stride()
Out[66]: (2, 1)
# shape (18, 1)
In [68]: t6 = t.view(18, -1)
# stride of tensor `t6` with shape (18, 1)
In [69]: t6.stride()
Out[69]: (1, 1)
तो यह view()
फंक्शन का जादू है । यह नए विचारों में से प्रत्येक के लिए (मूल) स्पर्शक के स्ट्रैड को बदलता है , जब तक कि नए दृश्य का आकार मूल आकार के साथ संगत नहीं हो जाता।
एक और दिलचस्प बात यह है कि एक उल्लेखनीय प्रगति tuples से पालन हो सकता है कि 0 में तत्व का मान है वें स्थिति 1 में तत्व के मूल्य के बराबर है सेंट आकार टपल की स्थिति।
In [74]: t3.shape
Out[74]: torch.Size([3, 6])
|
In [75]: t3.stride() |
Out[75]: (6, 1) |
|_____________|
यह है क्योंकि:
In [76]: t3
Out[76]:
tensor([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
स्ट्राइड का (6, 1)
कहना है कि 0 एल आयाम के साथ एक तत्व से अगले तत्व तक जाने के लिए , हमें कूदना होगा या 6 कदम उठाने होंगे। (यानी से जाने के लिए 0
करने के लिए 6
, एक 6 कदम उठाने के लिए है।) लेकिन एक तत्व से 1 में अगले तत्व पर जाने के लिए सेंट आयाम है, हम बस केवल एक कदम की जरूरत है (उदाहरण के लिए से जाने के लिए 2
करने के लिए3
)।
इस प्रकार, गणना की जानकारी इस बात के दिल में है कि गणना करने के लिए मेमोरी से तत्वों को कैसे एक्सेस किया जाता है।
यह फ़ंक्शन एक दृश्य लौटाएगा और बिल्कुल वैसा ही होगा torch.Tensor.view()
जैसा कि नया आकार मूल टेंसर के आकार के साथ संगत है। अन्यथा, यह एक प्रति लौटाएगा।
हालाँकि, torch.reshape()
चेतावनी के नोट :
संगत आवृत्तियों के साथ सन्निहित इनपुट और आदानों को कॉपी किए बिना फिर से आकार दिया जा सकता है, लेकिन किसी को नकल बनाम देखने के व्यवहार पर निर्भर नहीं होना चाहिए।
reshape
PyTorch में कॉल क्यों नहीं किया ?!