अजगर: Vectorize गणना का उपयोग कर कार्यान्वित किया चलने का दृष्टिकोण

0

सवाल

मैं कोशिश कर रहा हूँ लागू करने के लिए कुछ गणना, लेकिन मैं समझ नहीं सकते कैसे करने के लिए vectorize मेरे कोड नहीं है और छोरों का उपयोग कर.

मुझे समझाने दो: मैं एक मैट्रिक्स M[N,C] या तो 0 या 1. एक और मैट्रिक्स Y[N,1] युक्त मूल्यों के [0,C-1] (मेरी कक्षा). एक और मैट्रिक्स ds[N,M] जो डेटासेट.

मेरे आउटपुट मैट्रिक्स के आकार grad[M,C] और गणना की जानी चाहिए का पालन के रूप में: मैं समझाता हूँ के लिए grad[:,0], एक ही तर्क के लिए किसी भी अन्य स्तंभ ।

प्रत्येक पंक्ति के लिए(नमूना) में ds, तो Y[that sample] != 0 (वर्तमान स्तंभ के आउटपुट मैट्रिक्स) और M[that sample, 0] > 0 , तो grad[:,0] += ds[that sample]

अगर Y[that sample] == 0, तो grad[:,0] -= (ds[that sample] * <Num of non zeros in M[that sample,:]>)

यहाँ है मेरे चलने का दृष्टिकोण:

    for i in range(M.size(dim=1)):
        for j in range(ds.size(dim=0)):
            if y[j] == i:
                grad[:,i] = grad[:,i] - (ds[j,:].T * sum(M[j,:]))
            else:
                if M[j,i] > 0:
                    grad[:,i] = grad[:,i] + ds[j,:].T 
python pytorch vectorization
2021-11-23 15:58:15
1

सबसे अच्छा जवाब

1

के बाद से आप काम कर रहे हैं के साथ तीन आयामों n, mहै , और c (लोअरकेस में अस्पष्टता से बचने के लिए), यह कर सकते हैं उपयोगी हो करने के लिए का आकार बदलने सभी अपने tensors के लिए (n, m, c), नकल करके अपने मूल्यों से अधिक लापता आयाम (उदा. M(m, c) हो जाता है M(n, m, c)).

हालांकि, अगर आप को छोड़ कर सकते हैं स्पष्ट प्रतिकृति का उपयोग करें और प्रसारण, तो यह करने के लिए पर्याप्त है unsqueeze लापता आयाम (उदा. M(m, c) हो जाता है M(1, m, c).

इन बातों को देखते हुए, के vectorization के अपने कोड हो जाता है के रूप में इस प्रकार है

cond = y.unsqueeze(2) == torch.arange(M.size(dim=1)).unsqueeze(0)
pos = ds.unsqueeze(2) * M.unsqueeze(1) * cond
neg = ds.unsqueeze(2) * M.unsqueeze(1).sum(dim=0, keepdim=True) * ~cond
grad += (pos - neg).sum(dim=0)

यहाँ है एक छोटे से परीक्षण करने के लिए वैधता की जांच के लिए समाधान

import torch

n, m, c = 11, 5, 7

y = torch.randint(c, size=(n, 1))
ds = torch.rand(n, m)
M = torch.randint(2, size=(n, c))
grad = torch.rand(m, c)


def slow_grad(y, ds, M, grad):
    for i in range(M.size(dim=1)):
        for j in range(ds.size(dim=0)):
            if y[j] == i:
                grad[:,i] = grad[:,i] - (ds[j,:].T * sum(M[j,:]))
            else:
                if M[j,i] > 0:
                    grad[:,i] = grad[:,i] + ds[j,:].T
    return grad


def fast_grad(y, ds, M, grad):
    cond = y.unsqueeze(2) == torch.arange(M.size(dim=1)).unsqueeze(0)
    pos = ds.unsqueeze(2) * M.unsqueeze(1) * cond
    neg = ds.unsqueeze(2) * M.unsqueeze(1).sum(dim=0, keepdim=True) * ~cond
    grad += (pos - neg).sum(dim=0)
    return grad
  
# Assert equality of all elements function outputs, throws an exception if false
assert torch.all(slow_grad(y, ds, M, grad) == fast_grad(y, ds, M, grad))

महसूस नि: शुल्क परीक्षण के लिए पर अन्य मामलों में के रूप में अच्छी तरह से!

2021-11-24 12:14:50

आपको बहुत बहुत धन्यवाद!
sagi

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में