线程" main"中的例外情况java.lang.NoClassDefFoundError:org / deeplearning4j / nn / conf / layers / Layer

时间:2017-09-12 06:01:03

标签: apache-spark deeplearning4j nd4j

我正在尝试使用Deeplearning4j库在spark上构建应用程序。我有一个集群,我将使用spark-submit命令运行我的jar(使用intelliJ构建)。这是我的代码

package Com.Spark.Examples

import scala.collection.mutable.ListBuffer
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.canova.api.records.reader.RecordReader
import org.canova.api.records.reader.impl.CSVRecordReader
import org.deeplearning4j.nn.api.OptimizationAlgorithm
import org.deeplearning4j.nn.conf.MultiLayerConfiguration
import org.deeplearning4j.nn.conf.NeuralNetConfiguration
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.spark.impl.multilayer.SparkDl4jMultiLayer
import org.nd4j.linalg.lossfunctions.LossFunctions

object FeedForwardNetworkWithSpark {
  def main(args:Array[String]): Unit ={
    val recordReader:RecordReader = new CSVRecordReader(0,",")
    val conf = new SparkConf()
      .setAppName("FeedForwardNetwork-Iris")
    val sc = new SparkContext(conf)
    val numInputs:Int = 4
    val outputNum = 3
    val iterations =1
    val multiLayerConfig:MultiLayerConfiguration = new NeuralNetConfiguration.Builder()
      .seed(12345)
      .iterations(iterations)
      .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
      .learningRate(1e-1)
      .l1(0.01).regularization(true).l2(1e-3)
      .list(3)
      .layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(3).activation("tanh").weightInit(WeightInit.XAVIER).build())
      .layer(1, new DenseLayer.Builder().nIn(3).nOut(2).activation("tanh").weightInit(WeightInit.XAVIER).build())
      .layer(2, new OutputLayer.Builder(LossFunctions.LossFunction.MCXENT).weightInit(WeightInit.XAVIER)
        .activation("softmax")
        .nIn(2).nOut(outputNum).build())
      .backprop(true).pretrain(false)
      .build
    val network:MultiLayerNetwork = new MultiLayerNetwork(multiLayerConfig)
    network.init
    network.setUpdater(null)
    val sparkNetwork:SparkDl4jMultiLayer = new
        SparkDl4jMultiLayer(sc,network)
    val nEpochs:Int = 6
    val listBuffer = new ListBuffer[Array[Float]]()
    (0 until nEpochs).foreach{i => val net:MultiLayerNetwork = sparkNetwork.fit("/user/iris.txt",4,recordReader)
      listBuffer +=(net.params.data.asFloat().clone())
      }
    println("Parameters vs. iteration Output: ")
    (0 until listBuffer.size).foreach{i =>
      println(i+"\t"+listBuffer(i).mkString)}
  }
}

这是我的build.sbt文件

name := "HWApp"

version := "0.1"

scalaVersion := "2.12.3"

libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.6.0" % "provided"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.10" % "1.6.0" % "provided"
libraryDependencies += "org.deeplearning4j" % "deeplearning4j-nlp" % "0.4-rc3.8"
libraryDependencies += "org.deeplearning4j" % "dl4j-spark" % "0.4-rc3.8"
libraryDependencies += "org.deeplearning4j" % "deeplearning4j-core" % "0.4-rc3.8"
libraryDependencies += "org.nd4j" % "nd4j-x86" % "0.4-rc3.8" % "test"
libraryDependencies += "org.nd4j" % "nd4j-api" % "0.4-rc3.8"
libraryDependencies += "org.nd4j" % "nd4j-jcublas-7.0" % "0.4-rc3.8"
libraryDependencies += "org.nd4j" % "canova-api" % "0.0.0.14"

当我在intelliJ中看到我的代码时,它没有显示任何错误,但是当我在集群上执行应用程序时:我有这样的事情:

Error

我不知道它对我有什么要求。即使是一点帮助也将受到赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

我不确定你是如何想出这个版本列表的(我假设只是随机编译?请不要这样做。)

您正在使用1.5岁版本的dl4j,其依赖项比不再存在的版本早一年。

从头开始,按照我们的入门步骤开始,像其他任何开源项目一样的例子。

这些可以在这里找到: https://deeplearning4j.org/quickstart

这里有示例项目: https://github.com/deeplearnin4j/dl4j-examples

还有一些事情: Canova不再存在,已被重命名为datavec超过一年。

所有dl4j,datavec,nd4j,..版本必须相同。

如果您使用我们的任何scala模块(如spark),那些必须始终具有相同的scala版本。

所以你将scala 2.12与scala 2.10依赖项混合在一起,这是一个scala no no(甚至不是特定于dl4j)。

Dl4j最多只支持scala 2.11。这主要是因为像cdh和hortonworks这样的hadoop发行版还不支持scala 2.12。

编辑:另外需要注意的是dl4j具体是我们如何做火花版本。支持Spark 1和Spark 2。您的工件ID应为:

dl4j-spark _ $ {yourscala version}(通常为2.10,2.11) 具有依赖性: 0.9.1_spark _ $ {你的SPARK版本}

这也适用于我们的NLP模块。

为更多没有关注我们入门的人编辑(请执行此操作,我们保持最新):您还需要一个nd4j后端。通常这是nd4j-native-platform但是如果你使用gpus可能是cuda: nd4j-cuda - $ {你的CUDA VERSION} -platform