2025, Oct 30 21:31

PyTorch में टेन्सर को उलटी दिशा में रोल करें: नेगेटिव शिफ्ट का उपयोग

PyTorch टेन्सर में roll की दिशा बदलने का सही तरीका जानें: नेगेटिव शिफ्ट से बाएँ/ऊपर रोटेशन. 1D व मल्टी‑डायमेंशनल उदाहरण, स्पष्ट कोड और व्यावहारिक टिप्स.

PyTorch टेन्सर में roll से तत्वों को घुमाते समय, अक्सर लगता है कि दिशा सिर्फ एक ही है. डिफ़ॉल्ट रूप से, पॉज़िटिव शिफ्ट ऐसा प्रतीत होता है मानो मान “नीचे” या दाएँ जा रहे हों. लेकिन कई बार ज़रूरत उलटी दिशा की होती है: बाएँ या ऊपर की ओर रोटेशन. inverse से रिवर्स करना अलग बात है — वह पूरे क्रम को उलट देता है, जो दूसरी क्रिया है. बिना किसी अतिरिक्त जटिलता के दूसरी दिशा में रोल करने का न्यूनतम, व्यावहारिक तरीका यहाँ है.

समस्या का सेटअप

मान लीजिए आप 1D टेन्सर से शुरू करते हैं:

import torch

vec = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
shifted = vec.roll(1, 0)
print(shifted)

यह आख़िरी तत्व को सबसे आगे ले आता है, यानी दाएँ दिशा में रोटेशन करता है:

tensor([6., 1., 2., 3., 4., 5.])

हालाँकि, लक्ष्य उलटी दिशा में है:

[2.0, 3.0, 4.0, 5.0, 6.0, 1.0]

कुछ वर्कफ़्लो में रोटेशन के बाद आख़िरी तत्व को शून्य कर दिया जाता है, लेकिन यहाँ मुख्य बात रोल की दिशा बदलना है.

असल में हो क्या रहा है

roll किसी दिए गए डायमेंशन पर सर्कुलर शिफ्ट करता है. शिफ्ट का चिन्ह दिशा तय करता है: पॉज़िटिव मान एक ओर घुमाते हैं, नेगेटिव मान दूसरी ओर. inverse पूरे क्रम को उलट देता है, जो दिशात्मक शिफ्ट के बराबर नहीं है.

समाधान

उलटी दिशा में रोल करने के लिए नेगेटिव शिफ्ट दें. बस इतना ही.

import torch

src = torch.tensor([1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
rotated_left = src.roll(-1, 0)
print(rotated_left)

आउटपुट:

tensor([2., 3., 4., 5., 6., 1.])

आधिकारिक दस्तावेज़ में मल्टी-डायमेंशनल टेन्सर के लिए भी यही पैटर्न दिखाया गया है. उदाहरण के तौर पर, 4x2 टेन्सर को डायमेंशन 0 पर -1 शिफ्ट देकर ऊपर की ओर घुमाया गया है:

import torch

mat = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8]).view(4, 2)
print(mat)
print(torch.roll(mat, -1, 0))

आउटपुट:

tensor([[1, 2],
        [3, 4],
        [5, 6],
        [7, 8]])

tensor([[3, 4],
        [5, 6],
        [7, 8],
        [1, 2]])

संदर्भ: https://docs.pytorch.org/docs/stable/generated/torch.roll.html

यह क्यों मायने रखता है

सीक्वेंस ट्रांसफॉर्मेशन में दिशा अक्सर सूक्ष्म बग का स्रोत बनती है. roll के साथ नेगेटिव शिफ्ट देने से मंशा स्पष्ट रहती है और रिवर्स या किसी अन्य पोस्ट-प्रोसेस की ज़रूरत नहीं पड़ती. तेज़ी से “pop जैसी” क्रिया ढूँढते हुए डॉक्यूमेंटेशन सरसरी नज़र में पढ़ते समय यह छोटी-सी बात नज़रअंदाज़ हो सकती है, जबकि वही उपयोग वहाँ मौजूद है.

मुख्य बातें

यदि आपको PyTorch टेन्सर को उलटी दिशा में घुमाना हो, तो inverse पर न जाएँ और न ही कोई वर्कअराउंड बनाएं. लक्षित डायमेंशन पर roll को नेगेटिव शिफ्ट के साथ कॉल करें. इससे उद्देश्य साफ़ झलकता है, दस्तावेज़ित व्यवहार से मेल खाता है, और ऑपरेशन सही रहते हुए संक्षिप्त बना रहता है.

यह लेख StackOverflow के एक प्रश्न (लेखक: FlumeRS) और Aadvik के उत्तर पर आधारित है।