2017-02-19 17 views
0

Я впервые работаю с dl4j, так что легко на меня.Невозможно лить слушателя в коллекцию, DL4J

я написал следующую простую программу

import org.datavec.api.records.reader.RecordReader; 
import org.datavec.api.records.reader.impl.csv.CSVRecordReader; 
import org.datavec.api.split.FileSplit; 
import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator; 
import org.deeplearning4j.nn.api.OptimizationAlgorithm; 
import org.deeplearning4j.nn.conf.MultiLayerConfiguration; 
import org.deeplearning4j.nn.conf.NeuralNetConfiguration; 
import org.deeplearning4j.nn.conf.Updater; 
import org.deeplearning4j.nn.conf.layers.DenseLayer; 
import org.deeplearning4j.nn.conf.layers.OutputLayer; 
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; 
import org.deeplearning4j.nn.weights.WeightInit; 
import org.deeplearning4j.optimize.listeners.ScoreIterationListener; 
import org.nd4j.linalg.api.ndarray.INDArray; 
import org.nd4j.linalg.dataset.DataSet; 
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator; 
import org.nd4j.linalg.lossfunctions.LossFunctions; 
import org.deeplearning4j.eval.Evaluation; 

import java.io.File; 
import java.util.Collection; 


public class MLPClassifierLinear 
{ 
    public static void main(String[] args) throws Exception 
    { 
     int seed = 123; 
     double learnRate = 0.01; 
     int batchSize = 50; 
     int nEpochs = 30; 
     int numInputs = 2; 
     int numOutputs = 2; 
     int numHiddenNodes = 20; 
     int labelField = 0; 
     int numOfLabels = 2; 

     //Load Training Data 
     RecordReader rr = new CSVRecordReader(); 
     rr.initialize(new FileSplit(new File("C:\\Users\\Oria\\MLP\\linear_data_train.csv"))); 
     DataSetIterator trainIter = new RecordReaderDataSetIterator(rr, batchSize,0,2); 

     //Load Testing Data 
     RecordReader rrTest = new CSVRecordReader(); 
     rrTest.initialize(new FileSplit(new File("C:\\Users\\Oria\\MLP\\linear_data_eval.csv"))); 
     DataSetIterator testIter = new RecordReaderDataSetIterator(rrTest, batchSize,0,2); 

     MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() 
       .seed(seed) 
       .iterations(1) 
       .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) 
       .learningRate(learnRate) 
       .updater(Updater.NESTEROVS).momentum(0.9) 
       .list() 
       .layer(0, new DenseLayer.Builder() 
         .nIn(numInputs) 
         .nOut(numHiddenNodes) 
         .weightInit(WeightInit.XAVIER) 
         .activation("relu") 
         .build()) 
       .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) 
         .weightInit(WeightInit.XAVIER) 
         .activation("softmax") 
         .nIn(numHiddenNodes) 
         .nOut(numOutputs) 
         .build()) 
       .pretrain(false).backprop(true).build(); 

     MultiLayerNetwork model = new MultiLayerNetwork(conf); 
     model.init(); 
     model.setListeners(new ScoreIterationListener(10)); 

     for(int i = 0; i < nEpochs; i++) 
      model.fit(trainIter); 

     System.out.println("Evaluate model......."); 
     Evaluation eval = new Evaluation(numOutputs); 
     while(testIter.hasNext()) 
     { 
      DataSet t = testIter.next(); 
      INDArray features = t.getFeatureMatrix(); 
      INDArray lables = t.getLabels(); 
      INDArray predicted = model.output(features,false); 
      eval.eval(lables,predicted); 
     } 
     System.out.println(eval.stats()); 
    } 
} 

Код должен работать нормально. Это копия https://www.youtube.com/watch?v=8EIBIfVlgmU&t=1063s, которая является хорошо известным руководством по dl4j.

Однако код не компилируется. Я получаю сообщение об ошибке в строке model.SetListeners: «Метод setListeners (Collection) в типе MultiLayerNetwork не применим для аргументов (ScoreIterationListener)«

Когда я меняю его на «model.setListeners ((Collection) new ScoreIterationListener (10));» ошибка компиляции уходит, но вместо этого я получаю ошибку времени выполнения «Исключение в потоке» main «java.lang.ClassCastException: org.deeplearning4j.optimize.listeners.ScoreIterationListener нельзя отнести к java.util.Collection в MLPClassifierLinear.main (MLPClassifierLinear.java:71) "

Что происходит? Любой, кто столкнулся с dl4j, может помочь мне решить эту проблему?

ответ

0

Я хотел бы начать с наших примеров и убедитесь, что вы используете самую последнюю версию (0.7.2 на момент написания статьи): https://github.com/deeplearning4j/dl4j-examples

MultiLayerNetwork.setListeners имеет переменную арг на IterationListener: https://github.com/deeplearning4j/deeplearning4j/blob/master/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/multilayer/MultiLayerNetwork.java#L1232

Я чувствую, что реальная первопричина может быть чем-то еще?

+0

Может быть что-то еще. Я возился с ним, и теперь я получаю java.lang.ClassNotFoundException: org.bytedeco.javacpp.openblas exception. угадайте, что ничего не случилось с моей установкой dl4j, а скорее что-то еще. –

+0

CSVExample не работает. Также говорит: «java.lang.ClassNotFoundException: org.bytedeco.javacpp.openblas» –

+0

Не могли бы вы зарегистрировать проблему? Мне явно не хватает чего-то здесь: https://github.com/deeplearning4j/dl4j-examples/issues Мы не работаем на этом в нашем канале gitter. Этот пример отлично работает. –