ยังไงเพื่อเปลี่ยนผลลัพธ์ของ neural เครือข่ายและยังคงรถไฟเหรอครับ?

0

คำถาม

ฉันมี neural เครือข่ายซึ่งแสดงผล 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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่