2016-08-05 1 views
0

저는 Spark를 처음 접했고 현재 deeplearning4j API를 사용하여 신경망을 구축하려고합니다. 교육은 정상적으로 작동하지만 평가시 문제가 발생합니다. 나는 불꽃에 다음과 같은 오류 메시지가 나는이 문제에 대한 이유를 찾을 수 없습니다Spark를 사용한 Deeplearning4j : JavaRDD를 사용한 SparkDl4jMultiLayer 평가 <DataSet>

18:16:16,206 ERROR ~ Exception in task 0.0 in stage 14.0 (TID 19) 
java.lang.IllegalStateException: Network did not have same number of parameters as the broadcasted set parameters at org.deeplearning4j.spark.impl.multilayer.evaluation.EvaluateFlatMapFunction.call(EvaluateFlatMapFunction.java:75) 

, 정보를 얻고 deeplearning4j 스파 스입니다. 본질적으로이 예에서이 구조를 취했습니다 https://github.com/deeplearning4j/dl4j-spark-cdh5-examples/blob/2de0324076fb422e2bdb926a095adb97c6d0e0ca/src/main/java/org/deeplearning4j/examples/mlp/IrisLocal.java.

이 내 코드입니다

public class DeepBeliefNetwork { 

private JavaRDD<DataSet> trainSet; 
private JavaRDD<DataSet> testSet; 

private int inputSize; 
private int numLab; 
private int batchSize; 
private int iterations; 
private int seed; 
private int listenerFreq; 
MultiLayerConfiguration conf; 
MultiLayerNetwork model; 
SparkDl4jMultiLayer sparkmodel; 
JavaSparkContext sc; 

MLLibUtil mllibUtil = new MLLibUtil(); 

public DeepBeliefNetwork(JavaSparkContext sc, JavaRDD<DataSet> trainSet, JavaRDD<DataSet> testSet, int numLab, 
     int batchSize, int iterations, int seed, int listenerFreq) { 

    this.trainSet = trainSet; 
    this.testSet = testSet; 
    this.numLab = numLab; 
    this.batchSize = batchSize; 
    this.iterations = iterations; 
    this.seed = seed; 
    this.listenerFreq = listenerFreq; 
    this.inputSize = testSet.first().numInputs(); 
    this.sc = sc; 



} 

public void build() { 
    System.out.println("input Size: " + inputSize); 
    System.out.println(trainSet.first().toString()); 
    System.out.println(testSet.first().toString()); 

    conf = new NeuralNetConfiguration.Builder().seed(seed) 
      .gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue) 
      .gradientNormalizationThreshold(1.0).iterations(iterations).momentum(0.5) 
      .momentumAfter(Collections.singletonMap(3, 0.9)) 
      .optimizationAlgo(OptimizationAlgorithm.CONJUGATE_GRADIENT).list(4) 
      .layer(0, 
        new RBM.Builder().nIn(inputSize).nOut(500).weightInit(WeightInit.XAVIER) 
          .lossFunction(LossFunction.RMSE_XENT).visibleUnit(RBM.VisibleUnit.BINARY) 
          .hiddenUnit(RBM.HiddenUnit.BINARY).build()) 
      .layer(1, 
        new RBM.Builder().nIn(500).nOut(250).weightInit(WeightInit.XAVIER) 
          .lossFunction(LossFunction.RMSE_XENT).visibleUnit(RBM.VisibleUnit.BINARY) 
          .hiddenUnit(RBM.HiddenUnit.BINARY).build()) 
      .layer(2, 
        new RBM.Builder().nIn(250).nOut(200).weightInit(WeightInit.XAVIER) 
          .lossFunction(LossFunction.RMSE_XENT).visibleUnit(RBM.VisibleUnit.BINARY) 
          .hiddenUnit(RBM.HiddenUnit.BINARY).build()) 
      .layer(3, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD).activation("softmax").nIn(200) 
        .nOut(numLab).build()) 
      .pretrain(true).backprop(false).build(); 

} 

public void trainModel() { 

    model = new MultiLayerNetwork(conf); 
    model.init(); 
    model.setListeners(Collections.singletonList((IterationListener) new ScoreIterationListener(listenerFreq))); 

    // Create Spark multi layer network from configuration 

    sparkmodel = new SparkDl4jMultiLayer(sc.sc(), model); 
    sparkmodel.fitDataSet(trainSet); 

//Evaluation 
    Evaluation evaluation = sparkmodel.evaluate(testSet); 
    System.out.println(evaluation.stats()); 

사람이 내 JavaRDD을 처리하는 방법에 대한 조언이 있습니까? 나는 그 문제가 거기에 있다고 믿는다.

고맙습니다.

EDIT1

나는 0.4 rc.10 버전 을 deeplearning4j 사용하고 불꽃있어 1.5.0 다음은

11:03:53,088 ERROR ~ Exception in task 0.0 in stage 16.0 (TID 21 java.lang.IllegalStateException: Network did not have same number of parameters as the broadcasted set parameter 
at org.deeplearning4j.spark.impl.multilayer.evaluation.EvaluateFlatMapFunction.call(EvaluateFlatMapFunction.java:75) 
at org.deeplearning4j.spark.impl.multilayer.evaluation.EvaluateFlatMapFunction.call(EvaluateFlatMapFunction.java:41) 
at org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$4$1.apply(JavaRDDLike.scala:156) 
at org.apache.spark.api.java.JavaRDDLike$$anonfun$fn$4$1.apply(JavaRDDLike.scala:156) 
at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$17.apply(RDD.scala:706) 
at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$17.apply(RDD.scala:706) 
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) 
at org.apache.spark.rdd.RDD.iterator(RDD.scala:264) 
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
at org.apache.spark.scheduler.Task.run(Task.scala:88) 
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 
Driver stacktrace: 
at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1280) 
at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1268) 
at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1267) 
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) 
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47) 
at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1267) 
at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:697) 
at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:697) 
at scala.Option.foreach(Option.scala:236) 
at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:697) 
at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:1493) 
at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1455) 
at org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:1444) 
at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48) 
at org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:567) 
at org.apache.spark.SparkContext.runJob(SparkContext.scala:1813) 
at org.apache.spark.SparkContext.runJob(SparkContext.scala:1933) 
at org.apache.spark.rdd.RDD$$anonfun$reduce$1.apply(RDD.scala:1003) 
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:147) 
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:108) 
at org.apache.spark.rdd.RDD.withScope(RDD.scala:306) 
at org.apache.spark.rdd.RDD.reduce(RDD.scala:985) 
at org.apache.spark.api.java.JavaRDDLike$class.reduce(JavaRDDLike.scala:375) 
at org.apache.spark.api.java.AbstractJavaRDDLike.reduce(JavaRDDLike.scala:47) 
at org.deeplearning4j.spark.impl.multilayer.SparkDl4jMultiLayer.evaluate(SparkDl4jMultiLayer.java:629) 
at org.deeplearning4j.spark.impl.multilayer.SparkDl4jMultiLayer.evaluate(SparkDl4jMultiLayer.java:607) 
at org.deeplearning4j.spark.impl.multilayer.SparkDl4jMultiLayer.evaluate(SparkDl4jMultiLayer.java:597) 
at deep.deepbeliefclassifier.DeepBeliefNetwork.trainModel(DeepBeliefNetwork.java:117) 
at deep.deepbeliefclassifier.DataInput.main(DataInput.java:105) 
+0

예외가 발생한 곳에서 스택 추적을 게시 할 수 있습니까? – SpamBot

+0

답변을 주셔서 감사합니다. – graffo

+0

먼저 최신 버전을 사용해 보시겠습니까? 답장은 0.5.0 –

답변

0

는 당신이 우리에게 버전을 제공 할 수 스택 추적을의 사용하는 등? 나는 그곳에서 내부의 일부를 썼다. 매개 변수를 올바르게 전송하지 않는 것 같습니다.

매개 변수는 모델의 계수를 나타내는 1 개의 긴 벡터입니다.

Deeplearning4j는 실행 프로그램에서 전체 학습을 확장하기 위해 벡터의 매개 변수 평균을 사용합니다. 또한 kryo를 사용하고 있는지 확인하십시오. 최신 버전에서는 경고를합니다.

+0

입니다. 나는 kryo를 시도 할 것이다, 아직 그것을 듣지 않고 있었다. 어떻게 매개 변수의 수를 지정해야합니까? – graffo

+0

아니, 그럴 수 없어. FWIW, 여전히 문제가있는 경우 deeplearning4j.org의 링크를 참조하십시오 https://deeplearning4j.org/spark –

+0

Adam에게 감사드립니다. 새 버전을 사용해 보았지만 문제가 더 이상 발생하지 않으며 새로운 API가 JavaRDD로 교육을 수행합니다. 훨씬 쉽게. – graffo

관련 문제