को बदलने के लिए कैसे का उत्पादन तंत्रिका नेटवर्क और अभी भी ट्रेन?

0

सवाल

मैं एक तंत्रिका नेटवर्क है जो outputs output. मैं बदलना चाहते हैं output इससे पहले कि नुकसान और backpropogation होता है ।

यहाँ है, मेरी सामान्य कोड:

with torch.set_grad_enabled(training):
                  outputs = net(x_batch[:, 0], x_batch[:, 1]) # the prediction of the NN
                  # My issue is here:
                  outputs = transform_torch(outputs)
                  loss = my_loss(outputs, y_batch)

                  if training:
                      scheduler.step()
                      loss.backward()
                      optimizer.step()

मैं एक परिवर्तन समारोह, जो मैं मेरी के माध्यम से उत्पादन:

def transform_torch(predictions):
    torch_dimensions = predictions.size()
    torch_grad = predictions.grad_fn
    cuda0 = torch.device('cuda:0')
    new_tensor = torch.ones(torch_dimensions, dtype=torch.float64, device=cuda0, requires_grad=True)
    for i in range(int(len(predictions))):
      a = predictions[i]
      # with torch.no_grad(): # Note: no training happens if this line is kept in
      new_tensor[i] = torch.flip(torch.cumsum(torch.flip(a, dims = [0]), dim = 0), dims = [0])
    return new_tensor

मेरी समस्या है कि मैं एक त्रुटि मिलती है, पर अगले करने के लिए अंतिम पंक्ति:

RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.

किसी भी सुझाव है? मैं पहले से ही उपयोग करने की कोशिश की "मशाल के साथ.no_grad():" (टिप्पणी), लेकिन इस परिणाम बहुत ही गरीब प्रशिक्षण और मुझे विश्वास है कि ढ़ाल नहीं backpropogate ठीक से परिवर्तन के बाद समारोह ।

धन्यवाद!

1

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

1

त्रुटि काफी सही है के बारे में क्या मुद्दा है - जब आप एक नया बनाने tensor के साथ requires_grad = True, तुम बनाने के लिए एक पत्ती नोड ग्राफ में (जैसे मानकों के एक मॉडल के लिए) और नहीं करने के लिए अनुमति दी में क्या-जगह पर आपरेशन ।

समाधान सरल है, तो आप की जरूरत नहीं है बनाने के लिए new_tensor अग्रिम में. यह होना चाहिए नहीं है एक पत्ता नोड है; बस इसे बनाने के लिए मक्खी पर

new_tensor = [ ]
for i in range(int(len(predictions))):
    a = predictions[i]
    new_tensor.append(torch.flip(torch.cumsum(torch.flip(a, ...), ...), ...))

new_tensor = torch.stack(new_tensor, 0)    

इस new_tensor वारिस होगा सभी गुण की तरह dtype, device से predictions और होगा require_grad = True पहले से ही है.

2021-11-20 04:18:52

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

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

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

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

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