13

Sto guardando attraverso lo Caffe prototxt for deep residual networks e ho notato l'aspetto di un livello "Scale".Livello di scala nel Caffe

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

Tuttavia, questo strato non è disponibile nella Caffe layer catalogue. Qualcuno può spiegare la funzionalità di questo livello e il significato dei parametri o indicare una documentazione aggiornata per Caffe?

risposta

15

È possibile trovare una documentazione dettagliata su caffe here.

Specificamente, per "Scale" strato doc reads:

Calcola il prodotto di due ingressi blob, con la forma di quest'ultima Blob "broadcast" per adattarsi alla forma del primo. Equivale a piastrellare quest'ultimo Blob, quindi a calcolare il prodotto elementwise.
Il secondo input può essere omesso, nel qual caso viene appreso come parametro del livello.

Sembra, nel tuo caso, (singolo "fondo"), questo livello impara un fattore di scala per moltiplicare "res2b_branch2b". Inoltre, dal scale_param { bias_term: true } significa che il livello impara non solo un fattore di scala moltiplicativo, ma anche un termine costante. Quindi, il passo in avanti calcola:

res2b_branch2b <- res2b_branch2b * \alpha + \beta 

Durante l'allenamento i tentativi netti per imparare i valori di \alpha e \beta.

+0

Shai, Quindi equivale a mettere un livello convoluzionale con dimensione del filtro 1x1 dopo res2b_branch2b. Se lo facciamo anche l'output sarà y = W * x + b, e imparerà il W eb giusto? Quindi questo è equivalente al livello di scala quando non forniamo l'ultimo livello di fondo? – Dharma

+0

@Dharma è equivalente solo se 'x' è 1D.Non confondere il prodotto interno e la moltiplicazione scalare. – Shai

+0

oh ok. Quindi in questo caso apprende solo due parametri alpha e beta, invece di una matrice W intera. ho ragione? – Dharma

7

C'è anche qualche documentazione su di esso nel caffe.proto file, è possibile cercare 'ScaleParameter'.

Grazie mille per il tuo post :) Il livello di scala era esattamente quello che stavo cercando. Nel caso in cui qualcuno vuole un esempio per un livello in grado di scalare per uno scalare (0.5) e poi "aggiunge" -2 (e questi valori non dovrebbero cambiare):

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 
    } 
    } 
} 

(Probabilmente, i decay_mult di sono inutili qui però .. Ma non lo so Vedere i commenti) oltre a questo:

  • lr_mult:. 0 - spegne l'apprendimento per "che param" - Penso che la prima "param {" sempre() si riferisce ai pesi, il? secondo a bias (lr_mult non è specifico per ScaleLayer)
  • Filler
  • : un "FillerParameter" [see caffe.proto] che spiega come riempire il secondo blob ommited. Il valore predefinito è un valore "costante: ...".
  • bias_filler: parametro di raccontare come riempire un pregiudizio blob opzionale
  • bias_term: se c'è un blob pregiudizio

Tutto preso da caffe.proto. E: ho testato solo il livello precedente con entrambi i valori di riempimento = 1.2.

+1

dasWesen. Hai già fornito i pesi e il termine di bias. quindi metti lr_mult = 0 in modo che tu non abbia bisogno di impararli e decay_mult = 0 in modo da non dover penalizzare anche i pesi. – Dharma

+0

@Dharma: Aspetta, ero già nel bel mezzo del montaggio, ma: penso che decay_mult non siano necessari dopotutto. Almeno tali termini di regolarizzazione aggiuntivi non cambieranno la direzione del gradiente (perdita). Questo perché questi termini sono costanti, perché le variabili coinvolte (= scale e bias) non possono cambiare. - Ma potrebbe essere più veloce con decay_mult = 0. – dasWesen

+0

Ad ogni modo, bene Dharma hai menzionato il ruolo di decay_mult. – dasWesen