【问题标题】:Extends java class in scala and override method在 scala 中扩展 java 类并覆盖方法
【发布时间】:2018-05-16 15:14:18
【问题描述】:

我正在尝试实现自定义损失函数 (DL4J),遵循以下代码示例:https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/misc/lossfunctions/CustomLossL1L2.java

我需要扩展 ILossFunction 并重写一些方法。

问题: 该函数正在返回org.nd4j.linalg.primitives.Pair<Double, INDArray>

我试过了:

  override def computeGradientAndScore(
    labels: INDArray,
    preOutput: INDArray,
    activationFn: IActivation,
    mask: INDArray,
    average: Boolean
  ): Pair[Double, INDArray] = {
     Pair.makePair(
        computeScore(labels, preOutput, activationFn, mask, average),
        computeGradient(labels, preOutput, activationFn, mask)
    )
  }

并得到以下编译错误:

[info] Compiling 2 Scala sources to PATH
[error] PATH/CosineSimilarity.scala:78: overriding method computeGradientAndScore in trait ILossFunction of type (x$1: org.nd4j.linalg.api.ndarray.INDArray, x$2: org.nd4j.linalg.api.ndarray.INDArray, x$3: org.nd4j.linalg.activations.IActivation, x$4: org.nd4j.linalg.api.ndarray.INDArray, x$5: Boolean)org.nd4j.linalg.primitives.Pair[Double,org.nd4j.linalg.api.ndarray.INDArray];
[error]  method computeGradientAndScore has incompatible type
[error]   override def computeGradientAndScore(labels: INDArray, preOutput: INDArray, activationFn: IActivation, mask: INDArray, average: Boolean): Pair[Double, INDArray] = {
[error]                ^
[error] one error found
[error] (root/compile:compileIncremental) Compilation failed
[error] Total time: 4 s, completed 16 mai 2018 16:45:48

问题: 我怎样才能覆盖这个方法?

【问题讨论】:

    标签: java scala deeplearning4j


    【解决方案1】:

    以下代码

    import java.lang
    
    import org.nd4j.linalg.activations.IActivation
    import org.nd4j.linalg.api.ndarray.INDArray
    import org.nd4j.linalg.lossfunctions.ILossFunction
    import org.nd4j.linalg.primitives
    
    class MyLossFunction extends ILossFunction {
      override def computeScore(labels: INDArray, preOutput: INDArray, activationFn: IActivation, mask: INDArray, average: Boolean): Double = ???
    
      override def computeScoreArray(labels: INDArray, preOutput: INDArray, activationFn: IActivation, mask: INDArray): INDArray = ???
    
      override def computeGradient(labels: INDArray, preOutput: INDArray, activationFn: IActivation, mask: INDArray): INDArray = ???
    
      override def computeGradientAndScore(labels: INDArray, preOutput: INDArray, activationFn: IActivation, mask: INDArray, average: Boolean): primitives.Pair[lang.Double, INDArray] = {
        primitives.Pair.makePair(
          computeScore(labels, preOutput, activationFn, mask, average),
          computeGradient(labels, preOutput, activationFn, mask)
        )
      }
    
      override def name(): String = ???
    }
    

    编译
    scalaVersion := "2.12.6"
    
    libraryDependencies += "org.deeplearning4j" % "deeplearning4j-core" % "0.9.1"
    libraryDependencies += "org.nd4j" % "nd4j-native-platform" % "0.9.1" % Test
    libraryDependencies += "org.datavec" % "datavec-api" % "0.9.1"
    

    【讨论】:

    • 对于未来关注这个的人来说,很少有 cmets:请留意版本。我们已经推出了 1.x,但它可能很快就会过时。另请注意,您可以将 deeplearning4j-core 拆分很多(对于 nd4j-native-platform 也是如此) - 如果您对此有任何疑问,请在我们的支持渠道中提问。