2017-10-17 13 views
0

J'ai besoin d'ajouter une norme L1 en tant que régularisateur pour créer une condition de parcimonie dans mon réseau de neurones. Je voudrais former mon réseau à la classification et je suis j'ai besoin d'ajouter une norme L1 en tant que régularisateur pour créer une condition de parcimonie. J'ai besoin de former le réseau à la classification et je commence avec pytorch et je n'ai aucune ideia comment faire ceci. J'ai essayé de construire une norme L1 par moi-même, comme here, mais cela n'a pas fonctionné aussi.Norme L1 en tant que régularisateur dans Pytorch

Quelqu'un peut-il m'aider? Je dois mettre ce régularisateur après ConvTranspose2d, je voudrais faire someting comme ça dans Keras:

model.add(Dense(64, input_dim=64, 
      kernel_regularizer=regularizers.l2(0.01), 
      activity_regularizer=regularizers.l1(0.01))) 

Mais mon réseau a été créé en PyTorch selon le code ci-dessous

upconv = nn.ConvTranspose2d(inner_nc, outer_nc, 
            kernel_size=4, stride=2, 
            padding=1, bias=use_bias) 
     down = [downrelu, downconv] 
     up = [uprelu, upconv, upnorm] 
     model = down + up 

Merci

Répondre

1

vous pensez trop. Comme je vois de votre code Keras, vous essayez d'imposer une pénalité de L1 sur les activations de votre couche. La façon la plus simple serait juste de faire quelque chose comme ce qui suit:

activations_to_regularise = upconv(input) 
output = remaining_netowrk(activations_to_regularise) 

Faites ensuite votre fonction normale de perte pour évaluer la production contre une cible et incorporer également la perte L1 dans l'objectif, de sorte que vous obtenez

total_loss = criterion(output, target) + 0.01 * activations_to_regularise.abs() 
1

En pytorch, vous pouvez faire ce qui suit (en supposant que votre réseau est appelé net):

def l1_loss(x): 
    return torch.abs(x).sum() 

to_regularise = [] 
for param in net.parameters(): 
    to_regularise.append(param.view(-1)) 
l1 = l1_weight*l1_loss(torch.cat(to_regularise))