解决报错:RuntimeError: una de las variables necesarias para el cálculo del gradiente ha sido modificada por un inpl

Hoy encontré un error al usar pytorch para la segmentación de imágenes: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [4, 64, 350, 450]], which is output 0 of ReluBackward0, is at version 3; expected version 1 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).registre la solución aquí

Primero, comprenda el significado del error: las variables requeridas por pytorch se modificaron al realizar cálculos de gradiente, lo que resultó en la imposibilidad de realizar cálculos de gradiente.

La solución a este error es muy simple, simplemente busque el código en el código de su modelo y a+=b,a*=b,a-=bcámbielo a = a+b,a = a*b,a = a-ba

El motivo de este cambio es un problema con el propio Python.
Primero, eche un vistazo a la captura de pantalla del código a continuación y comprenderá el motivo:

b = 2
id(b)
Out[4]: 2298269821264
b += 1
id(b)
Out[6]: 2298269821296
b = b+1
id(b)
Out[8]: 2298269821328

De acuerdo con el código anterior, podemos saber que ya sea a + = b o a = a + b, se creará un nuevo objeto y se asignará una dirección al nuevo objeto. Lo anterior es el caso de int,
float tipos de datos , char y cadena.

b = [0]
id(b)
Out[10]: 2298871691776
b += [2]
id(b)
Out[12]: 2298871691776
b = b+[2]
id(b)
Out[14]: 2298871786368

Pero para la lista, a+=b significa que no se crea ningún objeto nuevo, y para a = a+b, se crea un objeto nuevo.

Para tensores en pytorch y listas en python, a+=b se usa para realizar operaciones de datos en el tensor original, mientras que a = a+b crea un nuevo objeto, por lo que al calcular el gradiente necesitamos crear un nuevo objeto para almacenar el nuevo. datos después de la operación.

おすすめ

転載: blog.csdn.net/m0_59151709/article/details/131998908