¿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?
davy.ai
En el primer enfoque, se intenta actualizar un subconjunto de la matriz de pesos indexándolo con dos tensores
i
yj
. 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: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.