मान लीजिए कि मेरे पास नीचे कोड है और मैं एल के जैकोबियन की गणना करना चाहता हूं, जो कि पाइटोरच में एक तंत्रिका नेटवर्क द्वारा की गई भविष्यवाणी है, एल आकार nx1 है जहां n एक मिनी बैच में नमूनों की संख्या है। मिनी बैच में प्रत्येक नमूने के लिए जैकोबियन की गणना करने के लिए एल (एन प्रविष्टियों) की प्रत्येक प्रविष्टि के लिए लूप से बचने के लिए कुछ कोड मैंने पाया कि इनपुट के संबंध में तंत्रिका नेटवर्क (एल) की एन भविष्यवाणियों का योग है और फिर योग के ढाल की गणना करें। पहले मैं समझ नहीं पा रहा हूं कि पाइटोरच आर्किटेक्चर में प्रत्येक नमूने के लिए ग्रेडियेंट के योग के बराबर योग का ग्रेडिएंट क्यों है। दूसरा मैंने योग के साथ और लूप के साथ दोनों की कोशिश की और परिणाम अलग हो गए। क्या यह संख्यात्मक सन्निकटन के कारण हो सकता है या क्योंकि योग का कोई मतलब नहीं है?

कोड नीचे है, जहां दोनों कार्य एक nn.module से संबंधित हैं:

def forward(self, x):
        with torch.set_grad_enabled(True):
            def function(x,t):
                 self.n = n = x.shape[1]//2

                 qqd = x.requires_grad_(True)
                 L = self._lagrangian(qqd).sum()
                 J = grad(L, qqd, create_graph=True)[0]

        
def _lagrangian(self, qqd):
    x = F.softplus(self.fc1(qqd))
    x = F.softplus(self.fc2(x))
    x = F.softplus(self.fc3(x))
    L = self.fc_last(x)
    return L
2
Saul Santos 27 सितंबर 2020, 12:33

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि यह होना चाहिए, यह सिर्फ एक खिलौना उदाहरण है

w = torch.tensor([2.], requires_grad=True)
x1 = torch.tensor([3.], requires_grad=True)
x2 = torch.tensor([4.], requires_grad=True)
y = w * a + w * b
y.backward() # calculate gradient

वापसी

>>> w.grad
tensor([7.])
1
YukiShioriii 27 सितंबर 2020, 13:34