web-dev-qa-db-fra.com

Comment utiliser la couche "BatchNorm" dans le café?

Je suis un peu confus quant à la façon d'utiliser/insérer "BatchNorm" couche dans mes modèles.
Je vois plusieurs approches différentes, par exemple:

ResNets : "BatchNorm" + "Scale" (pas de partage de paramètres)

"BatchNorm" la couche est immédiatement suivie de "Scale" couche:

layer {
    bottom: "res2a_branch1"
    top: "res2a_branch1"
    name: "bn2a_branch1"
    type: "BatchNorm"
    batch_norm_param {
        use_global_stats: true
    }
}

layer {
    bottom: "res2a_branch1"
    top: "res2a_branch1"
    name: "scale2a_branch1"
    type: "Scale"
    scale_param {
        bias_term: true
    }
}

exemple cifar1 : seulement "BatchNorm"

Dans l'exemple cifar10 fourni avec caffe, "BatchNorm" est utilisé sans aucun "Scale" le suivre:

layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
}

cifar1 Différent batch_norm_param pour TRAIN et TEST

batch_norm_param: use_global_scale est changé entre TRAIN et TEST phase:

layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  batch_norm_param {
    use_global_stats: false
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  include {
    phase: TRAIN
  }
}
layer {
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  batch_norm_param {
    use_global_stats: true
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  param {
    lr_mult: 0
  }
  include {
    phase: TEST
  }
}

Alors qu'est-ce que ça devrait être?

Comment utiliser"BatchNorm" couche de café?

13
Shai

Si vous suivez le papier d'origine, la normalisation du lot doit être suivie des couches d'échelle et de biais (le biais peut être inclus via l'échelle, bien que cela rende les paramètres de biais inaccessibles). use_global_stats devrait également être changé de formation (Faux) à test/déploiement (Vrai) - qui est le comportement par défaut. Notez que le premier exemple que vous donnez est un prototxt pour le déploiement, il est donc correct qu'il soit défini sur True.

Je ne suis pas sûr des paramètres partagés.

J'ai fait une pull request pour améliorer les documents sur la normalisation des lots, mais je l'ai ensuite fermée car je voulais la modifier. Et puis, je n'y suis jamais revenu.

Notez que je pense que lr_mult: 0 pour "BatchNorm" n'est plus requis (peut-être pas autorisé?), bien que je ne trouve pas le PR correspondant maintenant.

5
Jonathan

Après chaque BatchNorm, nous devons ajouter une couche d'échelle dans Caffe. La raison en est que la couche Caffe BatchNorm ne soustrait que la moyenne des données d'entrée et divise par leur variance, tout en n'incluant pas les paramètres γ et β qui mettent à l'échelle et décalent respectivement la distribution normalisée 1. Inversement, la couche Keras BatchNormalization inclut et applique tous les paramètres mentionnés ci-dessus. L'utilisation d'une couche d'échelle avec le paramètre "biais_term" défini sur True dans Caffe, fournit une astuce sûre pour reproduire le comportement exact de la version Keras. https://www.deepvisionconsulting.com/from-keras-to-caffe/

1
iraf