PyTorch : Aggregate dos modelos
Hola y saludos de Grecia
class Model(nn.Module):
def __init__(self, embedding_size, num_numerical_cols, output_size, layers, p=0.4):
super().__init__()
self.all_embeddings = nn.ModuleList([nn.Embedding(ni, nf) for ni, nf in embedding_size])
self.embedding_dropout = nn.Dropout(p)
self.batch_norm_num = nn.BatchNorm1d(num_numerical_cols)
all_layers = []
num_categorical_cols = sum((nf for ni, nf in embedding_size))
input_size = num_categorical_cols + num_numerical_cols
for i in layers:
all_layers.append(nn.Linear(input_size, i))
all_layers.append(nn.ReLU(inplace=True))
all_layers.append(nn.BatchNorm1d(i))
all_layers.append(nn.Dropout(p))
input_size = i
all_layers.append(nn.Linear(layers[-1], output_size))
self.layers = nn.Sequential(*all_layers)
def forward(self, x_categorical, x_numerical):
embeddings = []
for i,e in enumerate(self.all_embeddings):
embeddings.append(e(x_categorical[:,i]))
x = torch.cat(embeddings, 1)
x = self.embedding_dropout(x)
x_numerical = self.batch_norm_num(x_numerical)
x = torch.cat([x, x_numerical], 1)
x = self.layers(x)
return x
Supongamos que tengo esta nn para la clasificación y creo dos casos
model_1=Model(categorical_embedding_sizes, numerical_data.shape[1], 2, [200,100,50], p=0.4)
model_2=Model(categorical_embedding_sizes, numerical_data.shape[1], 2, [200,100,50], p=0.4)
Y después de entrenar estos dos modelos los salvé con torch.save
como model_1.pt
y model_2.pt
¿Hay una manera de crear un nuevo modelo con los parámetros medios de los dos modelos?
algo como
model_new.weight=(model_1.weight+model_2.weight)/2
model_new.bias=(model_1.bias+model_2.bias)/2
Gracias por adelantado
Pregunta hecha hace 3 años, 4 meses, 29 días - Por pixelpilot
3 Respuestas:
-
Usted puede hacer esto fácilmente generando un diccionario estatal de sus dos diccionarios estatales:
state_1 = model_1.state_dict() state_2 = model_2.state_dict() for layer in state_1: state_1[layer] = (state_1[layer] + state_2[layer])/2
Lo anterior se inclinará a través de parámetros (pesos y sesgos) de todas las capas.
Entonces sobreescribir este nuevo estado en ambos
model_1
o un modelo de nueva instancia, así:model_new = Model(categorical_embedding_sizes, numerical_data.shape[1], 2, [200,100,50], p=0.4) model_new.load_state_dict(state1)
Respondida el Dec 18, 2020 a las 10:11 - por codecanvas
Votos positivos: 0 | Votos negativos: 0 -
Para combinar los parámetros medios de dos modelos PyTorch, puedes seguir los siguientes pasos:
- Cargar los modelos guardados usando `torch.load`.
python model_1 = torch.load('model_1.pt') model_2 = torch.load('model_2.pt')
- Crear un nuevo modelo con los mismos parámetros que los modelos originales.
python model_new = Model(categorical_embedding_sizes, numerical_data.shape[1], 2, [200,100,50], p=0.4)
- Calcular los parámetros medios y asignarlos al nuevo modelo.
python for param_new, param_1, param_2 in zip(model_new.parameters(), model_1.parameters(), model_2.parameters()): param_new.data = (param_1.data + param_2.data) / 2
Con estos pasos, has creado un nuevo modelo
model_new
con los parámetros medios demodel_1
ymodel_2
. Ahora puedes usar este nuevo modelo para realizar inferencias en tus datos.Respondida el Dec 19, 2020 a las 10:11 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Claro, puedes crear un nuevo modelo con los parámetros promedio de dos modelos existentes utilizando el siguiente código:
python import torch
Cargar los dos modelos entrenados
model_1 = torch.load('model_1.pt') model_2 = torch.load('model_2.pt')Crear un nuevo modelo con la misma arquitectura
model_new = Model(categorical_embedding_sizes, numerical_data.shape[1], 2, [200,100,50], p=0.4)Promediar los pesos y sesgos de los dos modelos
for param_name in model_new.state_dict(): param_1 = model_1.state_dict()[param_name] param_2 = model_2.state_dict()[param_name] model_new.state_dict()[param_name].copy_((param_1 + param_2) / 2)Guardar el nuevo modelo
torch.save(model_new, 'model_new.pt')Este código recorrerá todos los parámetros del nuevo modelo y los promediará con los parámetros correspondientes de los dos modelos existentes. Luego guardará el nuevo modelo con los parámetros promedio.
Respondida el Dec 19, 2020 a las 10:14 - por Gemini
Votos positivos: 0 | Votos negativos: 0