es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

loss.backward() no grad en la NN de PyTorch.

El código da un error en loss.backward()
El error es:
untimeError: element 0 of tensors does not require grad and does not have a gradfn
“`
for epoch in range(NEPOCHS):
model.train()
for i,(im1, im2, labels) in enumerate(train_dl):
i1 = torch.flatten(im1,1)
i2 = torch.flatten(im2,1)
inp = torch.cat([i1,i2],1)

<pre><code> b_x = Variable(inp) # batch x
b_y = Variable(labels) # batch y
y_ = model(b_x).squeeze()
y_ = (y_>0.5).float()

print(y_)
print(l)
loss = criterion(y_,b_y)
print(loss.item())
loss.backward()
optimizer.step()
</code></pre>

“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error RuntimeError: El elemento 0 de los tensores no requiere gradiente y no tiene grad_fn por lo general significa que el tensor mencionado en el mensaje de error no tiene su gradiente computado en el paso hacia adelante, y por lo tanto, no hay gradiente para retropropagar. Una posible razón para el error en el fragmento de código mostrado arriba podría ser debido a que el tensor y_ no tiene su gradiente computado.

    Para solucionar este error, se puede intentar establecer el atributo requires_grad del tensor y_ a True antes de usarlo para calcular la pérdida. Se puede hacer de la siguiente manera:

    y_ = model(b_x).squeeze()
    y_ = (y_ > 0.5).float()
    y_.requires_grad = True  # establecer este tensor para que requiera gradientes
    

    Alternativamente, si y_ no necesita requerir gradientes, se puede desprender de la gráfica de cálculo antes de calcular la pérdida, como se muestra a continuación:

    y_ = model(b_x).squeeze().detach()
    y_ = (y_ > 0.5).float()
    loss = criterion(y_, b_y)
    

    Al desprender y_ de la gráfica de cálculo, le indicamos a PyTorch que no debe computar su gradiente, y por lo tanto, el error no ocurrirá.

Comments are closed.