8

Questo è il mio train.prototxt. E questo è il mio deploy.prototxt.Come creare caffe.deploy da train.prototxt

Quando voglio caricare il mio file Deploy ottengo questo errore:

File "./python/caffe/classifier.py", line 29, in __init__ 
in_ = self.inputs[0] 
IndexError: list index out of range 

Così, ho rimosso lo strato di dati:

F1117 23:16:09.485153 21910 insert_splits.cpp:35] Unknown bottom blob 'data' (layer 'conv1', bottom index 0) 
*** Check failure stack trace: *** 

Than, ho rimosso bottom: "data" dallo strato CONV1.

Dopo di esso, ho ottenuto questo errore:

F1117 23:17:15.363919 21935 insert_splits.cpp:35] Unknown bottom blob 'label' (layer 'loss', bottom index 1) 
*** Check failure stack trace: *** 

ho rimosso bottom: "label" dallo strato perdita. E ho ricevuto questo errore:

I1117 23:19:11.171021 21962 layer_factory.hpp:76] Creating layer conv1 
I1117 23:19:11.171036 21962 net.cpp:110] Creating Layer conv1 
I1117 23:19:11.171041 21962 net.cpp:433] conv1 -> conv1 
F1117 23:19:11.171061 21962 layer.hpp:379] Check failed: MinBottomBlobs() <= bottom.size() (1 vs. 0) Convolution Layer takes at least 1 bottom blob(s) as input. 
*** Check failure stack trace: *** 

Cosa devo fare per risolvere il problema e creare il mio file di distribuzione?

risposta

16

Ci sono due differenze principali tra un prototxt "treno" e "distribuire" uno:

1. Ingressi: Mentre per i dati di allenamento è fissato ad un insieme di dati di formazione pre-elaborati (lmdb/HDF5 etc .), l'implementazione della rete richiede di elaborare altri input in modo più "casuale".
Pertanto, la prima modifica consiste nel rimuovere i livelli di input (livelli che spingono "dati" e "etichette" durante le fasi TRAIN e TEST). Per sostituire i layer di input è necessario aggiungere la seguente dichiarazione:

input: "data" 
input_shape: { dim:1 dim:3 dim:224 dim:224 } 

Questa dichiarazione non fornisce i dati effettivi per la rete, ma racconta la rete che forma aspettarsi, permettendo caffe di pre-allocare le risorse necessarie .

2. Perdita: il livello più alto in un prototipo di allenamento definisce la funzione di perdita per l'allenamento. Questo di solito coinvolge le etichette di verità di base. Quando si distribuisce la rete, non si ha più accesso a queste etichette. Quindi gli strati di perdita dovrebbero essere convertiti in uscite di "previsione". Ad esempio, un livello "SoftmaxWithLoss" deve essere convertito in un semplice livello "Softmax" che restituisce la probabilità di classe anziché la probabilità di log-verosimiglianza. Alcuni altri livelli di perdita hanno già delle previsioni come input, quindi è sufficiente rimuoverle.

Aggiornamento: vedere this tutorial per ulteriori informazioni.

+0

Che cos'è 'dim: 1'? – 0x1337

+1

@ 0x1337 per definire la 'forma' dell'ingresso' "dati" 'usiamo [' 'BlobShape''] (https://github.com/BVLC/caffe/blob/master/src/caffe/proto /caffe.proto#L6) proto message. Questa 'forma' ha un parametro" ripetuto "' dim' che definisce una dimensione della 'forma'. 'dim: 1' significa che ci aspettiamo' 'data'', a deploy stage, per includere solo un campione alla volta (cioè, batch_size: 1'). – Shai

+1

@Shai Grazie per una chiara spiegazione. C'è un modo per generare in modo programmatico il deploy.prototxt in python simile?Maggiori dettagli sulla mia domanda sono qui - http://stackoverflow.com/questions/40986009/how-to-programmatically-generate-deploy-txt-for-caffe-in-python – cdeepakroy

0

Oltre ai consigli di @Shai, è possibile disabilitare anche i livelli di interruzione.

Sebbene Jia Yangqing, autore di Caffe una volta che detta strati dropout hanno un impatto trascurabile sui risultati di prova (google group conversation, 2014), altri strumenti apprendimento approfondito suggeriscono di disabilitare dropout nella fase di distribuzione (ad esempio, lasange).

+1

dipende dal modo in cui il tuo livello di dropout è implementato. In alcuni casi è necessario sostituire il dropout con un ridimensionamento per compensare l'aumento di energia del segnale che non viene rilasciato: ad esempio, se si rilascia il 50%, nel tempo di test si ha una maggiore forza del segnale x2 che passa attraverso il livello, necessità di ridimensionare l'output del 50%. – Shai