3

Ich versuche, meinen Einstufungsprozess ein wenig schneller zu machen. Ich dachte daran, das erste input_dim in meinem deploy.prototxt zu erhöhen, aber das scheint nicht zu funktionieren. Es ist sogar ein bisschen langsamer, als jedes Bild einzeln zu klassifizieren.Batch-Größe funktioniert nicht für Caffe mit deploy.prototxt

deploy.prototxt

input: "data" 
input_dim: 128 
input_dim: 1 
input_dim: 120 
input_dim: 160 
... net description ... 

Python Netto-Initialisierung

net=caffe.Net('deploy.prototxt', 'model.caffemodel', caffe.TEST) 
net.blobs['data'].reshape(128, 1, 120, 160) 
transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape}) 
#transformer settings 

Python Klassifizierung

images=[None]*128 
for i in range(len(images)): 
    images[i]=caffe.io.load_image('image_path', False) 
for j in range(len(images)): 
    net.blobs['data'].data[j,:,:,:] = transformer.preprocess('data',images[j]) 
out = net.forward()['prob'] 

Ich übersprang einige Details, aber die wichtigen Sachen gegeben werden sollte. Ich habe verschiedene Batch-Größen wie 32, 64, ..., 1024 ausprobiert, aber alle fast gleich. Meine Frage ist also, ob jemand eine Idee hat, was ich falsch mache oder was geändert werden muss? Danke für Hilfe!

EDIT:
Einige Timing-Ergebnisse, die avg-Zeiten sind nur die Gesamtzeiten geteilt durch die verarbeiteten Bilder (1044).

Chargengröße: 1

2016-05-04 10: 51: 20.721 - Detektor - INFO - Daten Form: (1, 1, 120, 160)
2016.05.04 10: 51: 35.149 - Haupt - INFO - GPU Timings:
2016.05.04 10: 51: 35.149 - Haupt - INFO - verarbeiteten Bilder: 1044
2016.05.04 10: 51: 35.149 - Haupt - INFO - Gesamtzeit: 14.43s
2016-05-04 10 : 51: 35.149 - Haupt - INFO - avg Zeit: 13.82ms
2016.05.04 10: 51: 35.149 - Haupt - INFO - Ladezeit: 8.31s
2016.05.04 10 : 51: 35.149 - Haupt - INFO - avg-Ladezeit: 7.96ms
2016.05.04 10: 51: 35.149 - Haupt - INFO - klassifizieren Zeit: 5.99s
2016-05- 04 10: 51: 35.149 - Haupt - INFO - avg-einstufen Zeit: 5.74ms

Chargengröße: 32

2016-05-04 10: 52: 30.773 - Detektor - INFO - Daten Form: (32, 1, 120, 160)
2016-05-04 10: 52: 45.135 - Haupt - INFO - GPU Timings:
2016.05.04 10: 52: 45.135 - Haupt - INFO - verarbeiteten Bilder: 1044
2016.05.04 10: 52: 45.135 - Haupt - INFO - Gesamtzeit: 14.36s
2016-05-04 10: 52: 45,136 - Haupt - INFO - durchschnittliche Zeit: 13.76m s
2016-05-04 10: 52: 45,136 - Haupt - INFO - Ladezeit: 7.13S
2016.05.04 10: 52: 45.136 - Haupt - INFO - avg-Ladezeit: 6.83ms
2016.05.04 10: 52: 45.136 - Haupt - INFO - klassifizieren Zeit : 7.13s
2016.05.04 10: 52: 45.136 - Haupt - INFO - avg-klassifizieren Zeit: 6.83ms

Chargengröße: 128

2016-05- 04 10: 53: 17,478 - Detektor - INFO - Datenform: (128, 1, 12 0, 160)
2016-05-04 10: 53: 31.299 - Haupt - INFO - GPU Timings:
2016.05.04 10: 53: 31.299 - Haupt - INFO - verarbeiteten Bilder: 1044
2016.05.04 10: 53: 31.299 - Haupt - INFO - Gesamtzeit: 13.82s
2016.05.04 10: 53: 31.299 - Haupt - INFO - avg Zeit: 13.24ms
2016.05.04 10: 53: 31.299 - Haupt - INFO - Ladezeit: 7.06s
2016.05.04 10: 53: 31.299 - Haupt - INFO - avg-Ladezeit: 6.77ms
2016.05.04 10: 53: 31.299 - Haupt - INFO - klassifizieren Zeit: 6.66s
2016-05-04 10:53: 31.299 - Haupt - INFO - avg-klassifizieren Zeit: 6.38ms

Chargengröße: 1024

2016-05-04 10: 54: 11.546 - Detektor - INFO - Daten Form: (1024, 1, 120, 160)
2016-05-04 10: 54: 25,316 - Haupt - INFO - GPU Timings:
2016.05.04 10: 54: 25.316 - Haupt - INFO - verarbeiteten Bilder: 1044
2016.05.04 10: 54: 25.316 - Haupt - INFO - Gesamtzeit: 13.77s
2016.05.04 10: 54: 25.316 - Haupt - INFO - avg Zeit: 13.19ms
2016.05.04 10: 54: 25.316 - Haupt - INFO - Ladezeit: 7,04s
2016-05-04 10: 54: 25,316 - Haupt - INFO - durchschnittliche Ladezeit: 6,75ms
2016.05.04 10: 54: 25.316 - Haupt - INFO - klassifizieren Zeit: 6.63s
2016.05.04 10: 54: 25.316 - Haupt - INFO - avg-klassifizieren Zeit: 6.35ms

+0

sind Sie GPU oder CPU verwenden? – Shai

+0

Ich benutze GPU: nvidia GTX980 Ti – Feuerteufel

+2

was meinst du mit "alle fast gleich"? Die Laufzeit von 'net.forward()' ist unabhängig von 'batch_size' gleich, oder die Laufzeit * geteilt durch 'batch_size' ist" fast gleich "? kannst du hier ein paar zahlen? – Shai

Antwort

0

ich bin mir ziemlich sicher, dass das Problem in Linie ist

for j in range(len(images)): 
net.blobs['data'].data[j,:,:,:] = transformer.preprocess('data',images[j]) 
out = net.forward()['prob'] 

Dadurch wird die Einzelbilddaten von der letzten Iteration der for-Schleife als das Netzwerk der einzige Eingabe einfach eingestellt.Versuchen Sie, die N Bilder Stapeln (sagen wir stackedimages) vorher und ruft die Zeile nur einmal beispiels

for j in range(len(images)): 
stackedimages <- transformer.preprocess('data',images[j]) 

Dann rufen,

net.blobs['data'].data[...] = stackedimages 
+0

Ich glaube nicht, dass dies ein Problem ist. Bei jeder Iteration wird eine andere Schicht von '['data']. data' gesetzt, und die 'forward()' wird erst aufgerufen, nachdem alle Schichten zugewiesen wurden. – Shai

+2

Ich bin mit @Shai. In '['data']. Data' sollte jeder Index j das entsprechende transformierte Bild am Ende der for-Schleife haben. Trotzdem habe ich eine Frage: Was ist die benötigte Datenstruktur für 'stackedimages'? Atm alle Bilder sind in einer Liste, aber eine Änderung wäre möglich. Oder wären 'net.blobs ['data']. Data [...] = images' möglich? – Feuerteufel

+0

Ahh ja, ich verstehe. Du hast recht. 'net.blobs ['data']. data [...] = images' würde funktionieren, wenn die' images' bereits alle transformiert sind. Stellen Sie nur sicher, dass sie entsprechend gestapelt sind, um den 4d Blob der gleichen Größe zu bilden – Prophecies

Verwandte Themen