¿Qué es «con antorcha no_grad» en PyTorch?

En este artículo, discutiremos qué hace con un método torch.no_grad() en PyTorch .

método torch.no_grad()

Con el método torch.no_grad() es como un bucle en el que cada tensor en ese bucle tendrá un require_grad establecido en False. Significa que los tensores con gradientes actualmente adjuntos al gráfico computacional actual ahora se separan del gráfico actual y ya no podremos calcular los gradientes con respecto a ese tensor. Hasta que el tensor está dentro del bucle, se separa del gráfico actual. Tan pronto como el tensor definido con gradiente está fuera del ciclo, se adjunta nuevamente al gráfico actual. Este método deshabilita el cálculo de gradiente, lo que reduce el consumo de memoria para los cálculos.

Ejemplo 1

En este ejemplo, definiremos un tensor A con require_grad=true y luego definiremos una función B dentro de torch.no_grad() usando el tensor A. Ahora el tensor A está dentro del ciclo, por lo que require_grad se establece en falso.

Python3

# import necessary libraries
import torch
  
# define a tensor
A = torch.tensor(1., requires_grad=True)
print("Tensor-A:", A)
  
# define a function using A tensor 
# inside loop
with torch.no_grad():
    B = A + 1
print("B:-", B)
  
# check gradient
print("B.requires_grad=", B.requires_grad)

Producción

Tensor-A: tensor(1., requires_grad=True)
B:- tensor(2.)
B.requires_grad= False

Ejemplo 2

En este ejemplo, definiremos dos funciones, una debe estar dentro del bucle y la otra estará fuera de él. Después de eso, verificaremos la diferencia entre el valor del parámetro require_grad para las dos funciones. En el resultado, veremos que require_grad se establece en False porque la función y está dentro del ciclo, lo que generalmente deshabilita el cálculo del gradiente, mientras que require_grad se establece en True para la función x, que está fuera del ciclo.

Python3

# import necessary libraries
import torch
  
# define  tensors
A = torch.tensor(1., requires_grad=False)
print("Tensor-A:", A)
B = torch.tensor(2.2, requires_grad=True)
print("Tensor-B:", B)
  
# define a function x outside loop and 
# check gradient
x = A+B
print("x:-", x)
print("x.requires_grad=", x.requires_grad)
  
# define a function y inside loop and 
# check gradient
with torch.no_grad():
    y = B - A
print("y:-", y)
print("y.requires_grad=", y.requires_grad)

Producción

Tensor-A: tensor(1.)
Tensor-B: tensor(2.2000, requires_grad=True)
x:- tensor(3.2000, grad_fn=<AddBackward0>)
x.requires_grad= True
y:- tensor(1.2000)
y.requires_grad= False

Ejemplo 3

En este ejemplo, solo estamos definiendo un tensor A usando el método de tensor, require_grad se establece en True y al definir una función x usando el tensor A dentro del método no_grad(), verificó el valor de require_grad para la función x. En la salida, la función x tiene require_grad se establece en False porque se especifica en el ciclo, lo que generalmente deshabilita el cálculo de gradiente.

Python3

# import necessary libraries
import torch
  
# define a tensor
A = torch.tensor(5., requires_grad=True)
print("Tensor-A:", A)
  
# define a function x inside loop and 
# check gradient
with torch.no_grad():
    x = A**2
print("x:-", x)
print("x.requires_grad=", x.requires_grad)

 Producción

Tensor-A: tensor(5., requires_grad=True)
x:- tensor(25.)
x.requires_grad= False

Publicación traducida automáticamente

Artículo escrito por akhilvasabhaktula03 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *