Расширяет класс Java в scala и переопределяет метод

Я пытаюсь реализовать пользовательскую функцию потерь (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

Вопрос: как переопределить этот метод?


person Theophile Champion    schedule 16.05.2018    source источник


Ответы (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"
person Dmytro Mitin    schedule 16.05.2018
comment
Несколько комментариев для тех, кто планирует это в будущем: пожалуйста, следите за версиями. У нас уже есть версия 1.x, и она может быстро устареть. Также обратите внимание, что вы можете немного разбить ядро ​​deeplearning4j (то же самое для nd4j-native-platform) — если у вас есть какие-либо вопросы по этому поводу, задайте их в наших каналах поддержки. - person Adam Gibson; 17.05.2018