2017-04-08 8 views
0

Ich bin neu zu deeplearning4J. Ich experimentierte bereits mit seiner Word2vec-Funktionalität und alles war in Ordnung. Aber jetzt bin ich etwas verwirrt bezüglich der Bildklassifizierung. Ich war mit diesem Beispiel zu spielen:klassifizieren neues Bild auf trainiert benutzerdefinierte Modell in deeplearning4j (Faltungsnetzwerk)

https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/AnimalsClassification.java

Ich habe die „save“ Flag auf wahr und mein Modell in model.bin-Datei gespeichert. nun den problematischen Teil kommt (es tut mir leid, wenn dies als dumme Frage klingt, vielleicht ich etwas wirklich offensichtlich hier bin fehlt)

ich eigene Klasse geschaffen genannt AnimalClassifier und ihr Zweck ist das Modell zu laden aus model.bin Datei wiederherstellen neuronales Netzwerk von ihm und klassifizieren dann einzelnes Bild unter Verwendung des wieder hergestellten Netzes. Für dieses einzelne Bild habe ich den Ordner "temp" erstellt -> dl4j-examples/src/main/resources/animals/temp/wo ich das Bild des Eisbären, das vorher im Trainingsprozess verwendet wurde, in AnimalsClassification.java platzierte (ich wollte sicher sein dieses Bild würde korrekt klassifiziert - deshalb habe ich das Bild vom "Bären" -Ordner wiederverwendet.

Dieser meinen Code versucht Eisbär zu klassifizieren:

protected static int height = 100; 
    protected static int width = 100; 
    protected static int channels = 3; 
    protected static int numExamples = 1; 
    protected static int numLabels = 1; 
    protected static int batchSize = 10; 

    protected static long seed = 42; 
    protected static Random rng = new Random(seed); 
    protected static int listenerFreq = 1; 
    protected static int iterations = 1; 
    protected static int epochs = 7; 
    protected static double splitTrainTest = 0.8; 
    protected static int nCores = 2; 
    protected static boolean save = true; 

    protected static String modelType = "AlexNet"; // 

    public static void main(String[] args) throws Exception { 

     String basePath = FilenameUtils.concat(System.getProperty("user.dir"), "dl4j-examples/src/main/resources/"); 
     MultiLayerNetwork multiLayerNetwork = ModelSerializer.restoreMultiLayerNetwork(basePath + "model.bin", true); 

     ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator(); 
     File mainPath = new File(System.getProperty("user.dir"), "dl4j-examples/src/main/resources/animals/temp/"); 
     FileSplit fileSplit = new FileSplit(mainPath, NativeImageLoader.ALLOWED_FORMATS, rng); 
     BalancedPathFilter pathFilter = new BalancedPathFilter(rng, labelMaker, numExamples, numLabels, batchSize); 


     InputSplit[] inputSplit = fileSplit.sample(pathFilter, 1); 
     InputSplit analysedData = inputSplit[0]; 


     ImageRecordReader recordReader = new ImageRecordReader(height, width, channels); 
     recordReader.initialize(analysedData); 
     DataSetIterator dataIter = new RecordReaderDataSetIterator(recordReader, batchSize, 0, 4); 
     while (dataIter.hasNext()) { 
      DataSet testDataSet = dataIter.next(); 

      String expectedResult = testDataSet.getLabelName(0); 
      List<String> predict = multiLayerNetwork.predict(testDataSet); 
      String modelResult = predict.get(0); 
      System.out.println("\nFor example that is labeled " + expectedResult + " the model predicted " + modelResult + "\n\n"); 
     } 
    } 

Danach läuft, bekomme ich Fehler:

java.lang.UnsupportedOperationException bei org.datavec.api.writable.ArrayWritable.toInt (ArrayWritable.java:47) bei org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.getDataSet (RecordReaderDataSetIterator.java:275) bei org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next (RecordReaderDataSetIterator.java:186) at org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next (RecordReaderDataSetIterator.java:389) bei org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator.next (RecordReaderDataSetIterator.java:52) bei org.deeplearning4j.examples.convolution. AnimalClassifier.main (AnimalClassifier.java:66) Von der Ziel-VM getrennt, Adresse: '127.0.0.1:63967', Transport: 'Socket' Ausnahme im Thread "main" java.lang.IllegalStateException: Label-Namen sind nicht definiert auf diesem Datensatz. Fügen Sie Labelnamen hinzu, um getLabelName mit einer ID zu verwenden. bei org.nd4j.linalg.dataset.DataSet.getLabelName (DataSet.java:1106) bei org.deeplearning4j.examples.convolution.AnimalClassifier.main (AnimalClassifier.java:68)

ich dort sehen kann, ist ein Methode public void setLabels (INDArray Etiketten) in MultiLayerNetwork.java, aber ich bekomme nicht wie zu verwenden (vor allem, wenn es als Argument INDArray dauert).

Ich bin auch verwirrt, warum ich die Anzahl der möglichen Bezeichnungen im Konstruktor von RecordReaderDataSetIterator angeben muss. Ich würde erwarten, dass dieses Modell bereits weiß, welche Etiketten zu verwenden sind (sollte es keine Etiketten verwenden, die während des Trainings automatisch verwendet wurden?). Ich denke, vielleicht lade ich das Bild völlig falsch herum ...

So zusammenzufassen, würde ich folgendes erreichen möchte einfach:

  1. wiederherstellen Netzwerk von Modell (das funktioniert)
  2. Last Bild klassifiziert (auch Arbeits)
  3. klassifizieren dieses Bild zu verwenden die gleichen Etiketten, die während des Trainings (Bär, Hirsch, Ente, Schildkröte) (schwierige Teil)

Vielen Dank im Voraus für Ihre Hilfe oder irgendwelche Hinweise verwendet wurden!

+0

Welche Version verwenden Sie? Betrachtet man den aktuellen RecordReaderDataSetIterator: https://github.com/deeplearning4j/deeplearning4j/blob/master/deeplearning4j-core/src/main/java/org/deeplearning4j/datasets/datavec/RecordReaderDataSetIterator.java#L275 gibt es keine Zeile 275 In Bezug auf Ihre Frage zu den numLabels: das ist Legacy und wird behoben werden: https://github.com/deeplearning4j/deeplearning4j/issues/3216 vielen Dank für das hinweisend. –

+0

Vielen Dank für Ihre Antwort. Die Version ist 0.8.0. Gibt es im Moment eine einfache Problemumgehung, wie man Schritt 3 (klassifizieren eines einzelnen Bildes im wiederhergestellten Netzwerk) ausführt? –

+0

Im Allgemeinen ist es ziemlich einfach - können Sie versuchen, dies anzupassen und zu sehen, was Sie bekommen: https://github.com/deeplearning4j/dl4j-examples/tree/master/dl4j-examples/src/main/java/org/deeplearning4j/ examples/dataexamples (siehe MNIST Speichern/Laden des gleichen Workflows) Wenn Sie sich das ansehen, sieht es so aus, als wäre Ihr Label-Index deaktiviert: https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/ src/main/java/org/deeplearning4j/Beispiele/dataexamples/MnistImagePipelineExampleLoad.java # L111 Es sollte 1 nicht 0 sein. 0 ist das Array nicht das int-Label. –

Antwort

0

So fasst Ihre mehrere Fragen hier zusammen: Ein Datensatz für Bilder ist 2 Einträge in einer Sammlung. Die zweite 1 ist das Etikett. Der Label-Index ist in Bezug auf die Art der Aufzeichnung Sie passieren

Der zweite Teil Ihrer Frage:. Mehrere Einträge können außer einem Datensatz sein. Die Liste bezieht sich auf ein Etikett für einen Artikel in einer bestimmten Zeile im Minibuch.

Verwandte Themen