2015-01-22 17 views
7

Come rimodellare un blob di forma N x C x H x W a N x 1 x (C*H) x W in Caffe?Come rimodellare un blob in Caffe?

Voglio creare uno strato di convoluzione i cui pesi sono identici tra i canali.

Un modo che ho in mente è di rimodellare il blob inferiore della forma N x C x H x W a N x 1 x (C*H) x W e posizionare uno strato di convoluzione su di esso. Ma non so come rimodellare un blob.

Per favore aiutatemi, grazie.

risposta

7

Come sottolineato da whjxnyzh, è possibile utilizzare "Reshape" strato. Caffe è abbastanza flessibile nel modo in cui consente di definire la forma di output.
Vedi the declaration of reshap_param in caffe.proto`:

// Specify the output dimensions. If some of the dimensions are set to 0, 
// the corresponding dimension from the bottom layer is used (unchanged). 
// Exactly one dimension may be set to -1, in which case its value is 
// inferred from the count of the bottom blob and the remaining dimensions. 

Nel tuo caso immagino avrai uno strato come questo:

layer { 
    name: "my_reshape" 
    type: "Reshape" 
    bottom: "in" 
    top: "reshaped_in" 
    reshape_param { shape: {dim: 0 dim: 1 dim: -1 dim: 0 } } 
} 

Vedi anche su caffe.help.

2

Se ho capito la tua destra obiettivo finale, strato convoluzione di Caffe già può fare più circonvoluzione input-output con/filtri comuni condivisi come:

layer { 
    name: "conv" 
    type: "Convolution" 
    bottom: "in1" 
    bottom: "in2" 
    bottom: "in3" 
    top: "out1" 
    top: "out2" 
    top: "out3" 
    convolution_param { 
    num_output : 10 #the same 10 filters for all 3 inputs 
    kernel_size: 3   
    } 
} 

Supponendo di avere tutti i flussi di split (strato fetta può farlo) e infine puoi unirli se lo desideri con uno strato concat o eltwise.

Questo evita il bisogno di rimodellare il blob, convolvi e quindi rimodellarlo indietro, il che potrebbe introdurre interferenze tra canali vicino ai margini.