Ruta de aprendizaje del marco Pytorch (cuatro: gráfico de cálculo y mecanismo de gráfico dinámico)

Mecanismo gráfico computacional y gráfico dinámico

Mecanismo gráfico computacional y gráfico dinámico

Gráfico de cálculo

1. ¿Qué es un gráfico de cálculo?

¿Qué es un gráfico computacional?
inserte la descripción de la imagen aquí

2. Gráfico de cálculo y derivación de gradiente.

inserte la descripción de la imagen aquí
Use el código para verificar el ejemplo de la imagen de arriba:

import torch

w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)

a = torch.add(w, x)     # retain_grad()
b = torch.add(w, 1)
y = torch.mul(a, b)

y.backward()
print(w.grad)

AFUERA:

tensor([5.])
3. Nodos de hoja

¿Qué es un nodo hoja?

  • Respuesta : Los nodos creados por los usuarios se denominan nodos hoja , como X y W.
  • is_leaf : Indica si el tensor es un nodo hoja.

inserte la descripción de la imagen aquí
Utilice el código para comprobar cuáles de los gráficos de cálculo anteriores son nodos hoja:

import torch

w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)

a = torch.add(w, x)     # retain_grad()
# a.retain_grad()        # 执行 retain_grad()会保留非叶子节点的梯度
b = torch.add(w, 1)
y = torch.mul(a, b)

y.backward()
# print(w.grad)

# 查看叶子结点
print("w是is_leaf ? : {}\nx是is_leaf ? : {}\na是is_leaf ? : {}\nb是is_leaf ? : {}\ny是is_leaf ? : {}\n".format(w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf))

# 查看梯度
print("\nw gradient = {}\nx gradient = {}\na gradient = {}\nb gradient = {}\n y gradient = {}\n".format(w.grad, x.grad, a.grad, b.grad, y.grad))

AFUERA:

w是is_leaf ? : True
x是is_leaf ? : True
a是is_leaf ? : False
b是is_leaf ? : False
y是is_leaf ? : False

w gradient = tensor([5.])
x gradient = tensor([2.])
a gradient = None
b gradient = None
y gradient = None

A partir de los resultados del código anterior de calcular el gradiente de cada nodo, podemos obtener el papel de los nodos hoja:

  • Ahorra espacio en la memoria , ¿por qué dices eso?
  • A partir de los resultados del código anterior, se puede ver que solo los gradientes de los nodos hoja (w y x) se guardan en el espacio de memoria, por lo que se pueden generar, y los derivados de los nodos no hoja (a, b , y) se borran, por lo que la salida es Ninguno .

Si desea mantener el gradiente de los nodos que no son hojas: use retain_grad() para mantener

retain_grad()        # 执行 retain_grad()会保留非叶子节点的梯度

grad_fn: registra el método utilizado para crear el tensor

inserte la descripción de la imagen aquí

import torch

w = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)

a = torch.add(w, x)     # retain_grad()
a.retain_grad()        # 执行 retain_grad()会保留非叶子节点的梯度
b = torch.add(w, 1)
y = torch.mul(a, b)

y.backward()
# print(w.grad)

# 查看叶子结点
# print("w是is_leaf ? : {}\nx是is_leaf ? : {}\na是is_leaf ? : {}\nb是is_leaf ? : {}\ny是is_leaf ? : {}\n".format(w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf))

# 查看梯度
# print("\nw gradient = {}\nx gradient = {}\na gradient = {}\nb gradient = {}\ny gradient = {}\n".format(w.grad, x.grad, a.grad, b.grad, y.grad))

# 查看 grad_fn
print("w的grad_fn: {}\nx的grad_fn: {}\na的grad_fn: {}\nb的grad_fn: {}\ny的grad_fn: {}\n".format(w.grad_fn, x.grad_fn, a.grad_fn, b.grad_fn, y.grad_fn))

AFUERA:

w的grad_fn: None
x的grad_fn: None
a的grad_fn: <AddBackward0 object at 0x00000188C0B7BC50>
b的grad_fn: <AddBackward0 object at 0x00000188C0B7BC88>
y的grad_fn: <MulBackward0 object at 0x00000188C0D215C0>

Del resultado del código anterior, podemos saber que: grad_fn: guarda la operación de cada nodo. como

a的grad_fn: <AddBackward0 object at 0x00000188C0B7BC50>

a: Se obtiene por suma y se almacena en la dirección 0x00000188C0B7BC50 .

Gráficos dinámicos vs gráficos estáticos

inserte la descripción de la imagen aquí

Mapa estático: Si nos apuntamos a un equipo de viaje, nuestra ruta de recorrido es fija. Es decir, primero determinamos la ruta de viaje general y luego jugamos, lo que se llama estático.

Imagen dinámica: si compramos nuestros propios boletos aéreos, primero iremos a Singapur, luego a la provincia de Taiwán y luego a la ciudad de Japón, pero cuando lleguemos a Singapur, alguien recomienda ir primero a la ciudad de Japón, por lo que decidimos cambiar. la ruta e ir primero al condado de Tokio, ciudad de Japón. , que es dinámico, podemos ajustar el modelo en cualquier momento.

Supongo que te gusta

Origin blog.csdn.net/weixin_54546190/article/details/125075211
Recomendado
Clasificación