web-dev-qa-db-fra.com

Couche d'échelle dans Caffe

Je regarde à travers le Caffe prototxt pour les réseaux résiduels profonds et j'ai remarqué l'apparition d'un "Scale" couche.

layer {
    bottom: "res2b_branch2b"
    top: "res2b_branch2b"
    name: "scale2b_branch2b"
    type: "Scale"
    scale_param {
        bias_term: true
    }
}

Cependant, cette couche n'est pas disponible dans le catalogue de couches Caffe . Quelqu'un peut-il expliquer la fonctionnalité de cette couche et la signification des paramètres ou pointer vers une documentation à jour pour Caffe?

16
Igor Ševo

Vous pouvez trouver une documentation détaillée sur caffe ici .

Spécifiquement pour "Scale" couche le doc lit :

Calcule un produit de deux Blobs d'entrée, avec la forme de ce dernier Blob "broadcast" pour correspondre à la forme du premier. Équivaut à paver ce dernier Blob, puis à calculer le produit élément par élément.
La deuxième entrée peut être omise, auquel cas elle est apprise en tant que paramètre de la couche.

Il semble que, dans votre cas, (simple "bas"), cette couche apprenne un facteur d'échelle pour se multiplier "res2b_branch2b". De plus, puisque scale_param { bias_term: true } signifie que la couche apprend non seulement un facteur d'échelle multiplicatif, mais aussi un terme constant. Ainsi, la passe avant calcule:

res2b_branch2b <- res2b_branch2b * \alpha + \beta

Pendant l'entraînement, le filet essaie d'apprendre les valeurs de \alpha et \beta.

18
Shai

Il y a aussi une documentation à ce sujet dans le fichier caffe.proto , vous pouvez rechercher 'ScaleParameter'.

Merci beaucoup pour votre message :) La couche d'échelle était exactement ce que je cherchais. Au cas où quelqu'un voudrait un exemple pour une couche qui évolue par un scalaire (0,5) puis "ajoute" -2 (et ces valeurs ne devraient pas changer):

layer {
  name: "scaleAndAdd"
  type: "Scale"
  bottom: "bot"
  top: "scaled"
  param {
    lr_mult: 0
    decay_mult: 0
  }
  param {
    lr_mult: 0
    decay_mult: 0
  }
  scale_param {
    filler {
      value: 0.5    }
    bias_term: true
    bias_filler {
      value: -2
    }
  }
}

(Probablement, les decay_mult ne sont pas nécessaires ici cependant. Mais ne sais pas. Voir les commentaires. ) Autre que cela:

  • lr_mult: 0 - désactive l'apprentissage de "ce paramètre" - je pense que le premier "param {" toujours (?) fait référence aux poids, le second au biais (lr_mult n'est pas spécifique à ScaleLayer)
  • filler: un "FillerParameter" [voir caffe.proto] indiquant comment remplir le deuxième blob omis. La valeur par défaut est une "valeur: ..." constante.
  • biais_filler: paramètre indiquant comment remplir un blob de biais facultatif
  • biais_term: s'il existe un blob de biais

Tous tirés de caffe.proto. Et: je n'ai testé la couche ci-dessus qu'avec les deux valeurs de remplissage = 1,2.

10
dasWesen