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.

¿Cómo cambiar los parámetros de mi modelo manualmente?

Tengo un modelo:

import torch
import torch.nn as nn
import torch.optim as optim

class Modelo(nn.Module):
def init(self):
super(Modelo, self).init()
self.fc1 = nn.Linear(1, 3)
self.fc2 = nn.Linear(3, 2)
self.fc3 = nn.Linear(2, 1)

def forward(self, x):
    x1 = self.fc1(x)
    x = torch.relu(x1)
    x2 = self.fc2(x)
    x = torch.relu(x2)
    x3 = self.fc3(x)
    return x3, x2, x1

net = Modelo()

Estoy tratando de actualizar manualmente los parámetros con

i, j = torch.meshgrid(torch.arange(3), torch.arange(2))
i = i.reshape(-1)
j = j.reshape(-1)
actualizacion = torch.ones(6, 1)
print(i)
print(j)
print(actualizacion.squeeze())
print(net.fc2.weight[j, i].data)
net.fc2.weight[j, i].data += actualizacion.squeeze()
print(net.fc2.weight[j, i].data)

tensor([0, 0, 1, 1, 2, 2])
tensor([0, 1, 0, 1, 0, 1])
tensor([1., 1., 1., 1., 1., 1.])
tensor([-0.0209, -0.3770, 0.4982, -0.2123, -0.2630, -0.5580])
tensor([-0.0209, -0.3770, 0.4982, -0.2123, -0.2630, -0.5580])

Pero nada parece cambiar.

Sin embargo, si hago

print(net.fc2.weight[1].data)
net.fc2.weight[1].data += 1
print(net.fc2.weight[1].data)

tensor([-0.3770, -0.2123, -0.5580])
tensor([0.6230, 0.7877, 0.4420])

Sí cambian.

¿Qué estoy haciendo mal en el primer enfoque y cómo puedo hacer que funcione?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    En el primer enfoque, se intenta actualizar un subconjunto de la matriz de pesos indexándolo con dos tensores i y j. Sin embargo, este enfoque no cambia el tensor original y no propaga los cambios al resto del modelo.

    Para hacerlo funcionar, se puede usar la operación en el lugar add_() en la matriz de pesos original, que actualizará los valores de la matriz y propagará los cambios al resto del modelo:

    net.fc2.weight.data[j, i].add_(update.squeeze())
    

    Tenga en cuenta que es necesario utilizar data para acceder al tensor subyacente de la matriz de pesos, ya que se está modificando in situ.

    El uso de add_() actualizará los valores de la matriz de pesos y propagará los cambios al resto del modelo, incluyendo los cálculos de pase hacia adelante y pase hacia atrás.

Comments are closed.