2016-05-21 10 views
4

ich trainierte Modell mit folgendem Befehl speichere:Probleme in sparen - Last apollocaffe Modelle

net.save(model_name) 

und dann mit folgendem Befehl geladen:

net.load(model_name) 

Aber nach dem Laden des Modells, wenn ich Ich versuche Blobs mit net.blobs() zu drucken, es gibt mir ein leeres Wörterbuch. Es sieht so aus, als wäre das Modell entweder nicht richtig gespeichert oder wird nicht korrekt geladen.

Bitte helfen Sie mir in dieser Hinsicht. Danke im Voraus.

+0

haben Sie eine Protokollausgabe für 'net.load (model_name)'? Wie definierst du die Netzstruktur zu deinem Modell? ist es möglich, dass Sie 'net.load' aufrufen müssen, nachdem Sie das Netz erstellt haben (entweder durch Laden eines' prototxt' oder durch Verwendung von 'net.f')? – Shai

+0

Danke für die Antwort. Ich verwende simple.py von http://apollocaffe.com/#Tutorial. Ich verwende am Ende net.save ("model.caffemodel"), um das Modell zu speichern. Und zum Laden versucht sowohl net = apollocaffe.Apollonet ("model.caffemodel") und net.load ("model.caffemodel"). Aber in beiden Fällen gibt mir net.loss 0,0. Ich verstehe, dass ich etwas über die Architektur des Netzes laden muss. Aber ich bin mir nicht sicher, was genau geladen werden muss. Ich habe wenige Dinge ausprobiert, aber nichts funktioniert. Es wäre großartig, wenn Sie Ihre Gedanken dazu teilen könnten. – Shweta

+0

Ich kenne den Workflow "apollocaffe" nicht. In regulärem caffe haben Sie zwei Dateien, die Ihr Modell beschreiben: 'model.caffemodel' - eine binäre Datei, die die numerischen Werte der trainierten Gewichte speichert * und *' deploy.prototxt' eine Textdatei, die die Netzarchitektur beschreibt: welche Schichten sind verwendet und wie diese Ebenen miteinander verbunden sind. Es scheint, als ob Ihnen der zweite Teil fehlt: die Netzstrukturinformationen. Überprüfen Sie, ob Sie diese Struktur mit Apollocaffe-Schnittstelle speichern/laden können. – Shai

Antwort

0

Ich sah mehr in die Details dieses Problem und sieht so aus, als würde ich es speichern und es korrekt laden. Das Problem ist, dass nach dem Laden des Modells net.blobs keinen Wert haben wird. Aber wenn Sie das geladene Modell mit einem Testbeispiel verwenden, funktioniert es (wie erwartet). Ich füge ein Beispiel-Code, inspiriert von https://github.com/Russell91/apollocaffe/blob/master/examples/apollocaffe/simple.py hier der gut arbeitet:

import apollocaffe 
from apollocaffe.layers import NumpyData, Convolution, EuclideanLoss 
import numpy as np 

def save(): 
    net = apollocaffe.ApolloNet() 
    for i in range(1000): 
     example = np.array(np.random.random()).reshape((1, 1, 1, 1)) 
     net.clear_forward() 
     net.f(NumpyData('data', example)) 
     net.f(NumpyData('label', example*3)) 
     net.f(Convolution('conv', (1,1), 1, bottoms=['data'])) 
     net.f(EuclideanLoss('loss', bottoms=['conv', 'label'])) 
     net.backward() 
     net.update(lr=0.1) 
     if i % 100 == 0: 
      print net.loss 
     net.save("model.h5") 


def load(): 
    print "LOAD" 
    net = apollocaffe.ApolloNet() 
    net.load("model.h5") 
    #example = np.array(np.random.random()).reshape((1, 1, 1, 1)) 
    example = np.asarray([[[[ 0.92890837]]]]) 
    net.clear_forward() 
    net.f(NumpyData('data', example)) 
    net.f(NumpyData('label', example*3)) 
    net.f(Convolution('conv', (1,1), 1, bottoms=['data'])) 
    net.f(EuclideanLoss('loss', bottoms=['conv', 'label'])) 
    net.backward() 
    net.update(lr=0.1) 
    print net.loss 

save() 
load() 
+0

Es scheint, als ob Sie zwischen den erlernten Parametern des Netzes (gespeichert in 'net.layers') und der Antwort des Netzes (d. H. Die Ausgabe der Filter) zu einer bestimmten Eingabe (gespeichert in' net.blobs') verwirren. Weitere Informationen finden Sie unter [Antwort] (http://stackoverflow.com/a/31847179/1714410). – Shai

2

Es gibt zwei Elemente zu Ihrer Frage.

Ersparnis:

Inorder das Modell zu laden, müssen Sie es in HDF5-Format speichern. Dies kann mit SnapshotLogger Klasse durchgeführt werden, wie gezeigt:

from apollocaffe.loggers import SnapshotLogger 

SnapshotLogger(snapshot_interval, snapshot_prefix='PATH_TO_YOUR_MODEL', 
     log_file="PATH_TO_log.txt") 

Laden:

Loading ein gespeichertes Modell durchgeführt werden kann, wie gezeigt:

net = apollocaffe.ApolloNet() 
model_path = "../model_name.h5" 
net.load(model_path)