Exception in thread "main" java.lang.NoClassDefFoundError: org/deeplearning4j/nn/conf/layers/Layer

Exception in thread "main" java.lang.NoClassDefFoundError: org/deeplearning4j/nn/conf/layers/Layer

我正在尝试使用 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 中看到我的代码时,它没有显示任何错误,但是当我在集群上执行应用程序时:我得到了这样的信息:

我不知道它想从我这里得到什么。即使提供一点帮助,我们也将不胜感激。谢谢

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

您使用的是 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 不行不行(这甚至不是 dl4j 特定的)。

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

编辑:另一件需要注意的事情是 dl4j 特定的是我们如何制作 spark 版本。支持 Spark 1 和 2。您的工件 ID 应该是:

dl4j-spark_${yourscala 版本}(通常为 2.10、2.11) 具有如下依赖性: 0.9.1_spark_${您的 SPARK 版本}

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

为更多尚未关注我们入门的人编辑(请关注,我们会保持最新):您还始终需要一个 nd4j 后端。通常这是 nd4j-native-platform 但如果你使用 gpus 可能是 cuda: nd4j-cuda-${您的 CUDA 版本}-平台