¿Cómo inicializo los pesos y sesgos de una red (a través de, por ejemplo, la inicialización de He o Xavier)?
Para inicializar los pesos de una sola capa, use una función de torch.nn.init . Por ejemplo:
conv1 = torch.nn.Conv2d(...) torch.nn.init.xavier_uniform(conv1.weight) Alternativamente, puede modificar los parámetros escribiendo en conv1.weight.data (que es un torch.Tensor ). Ejemplo:
conv1.weight.data.fill_(0.01)Lo mismo se aplica a los sesgos:
conv1.bias.data.fill_(0.01)nn.Sequential o custom nn.Module Pase una función de inicialización a torch.nn.Module.apply . Inicializará los pesos en todo el nn.Module recursivamente.
apply( fn ): aplica
fnrecursivamente a cada submódulo (tal como lo devuelve.children()), así como a sí mismo. El uso típico incluye inicializar los parámetros de un modelo (ver también torch-nn-init).
Ejemplo:
def init_weights(m): if isinstance(m, nn.Linear): torch.nn.init.xavier_uniform(m.weight) m.bias.data.fill_(0.01) net = nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2)) net.apply(init_weights)Para inicializar capas, normalmente no necesita hacer nada. PyTorch lo hará por ti. Si lo piensas bien, esto tiene mucho sentido. ¿Por qué deberíamos inicializar capas, cuando PyTorch puede hacerlo siguiendo las últimas tendencias?
Compruebe, por ejemplo, la capa Lineal .
En el método __init__ llamará a la función de inicio de Kaiming He .
def reset_parameters(self): init.kaiming_uniform_(self.weight, a=math.sqrt(3)) if self.bias is not None: fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight) bound = 1 / math.sqrt(fan_in) init.uniform_(self.bias, -bound, bound) Lo mismo es para otros tipos de capas. Para conv2d , por ejemplo, consulte aquí .
Para tener en cuenta: la ganancia de una inicialización adecuada es la velocidad de entrenamiento más rápida. Si su problema merece una inicialización especial, puede hacerlo después.