Package

com.thoughtworks

deeplearning

Permalink

package deeplearning

Visibility
  1. Public
  2. All

Type Members

  1. trait Symbolic[NativeOutput] extends AnyRef

    Permalink

    Provides @Symbolic annotation to create symbolic methods, in which you can create Layers from mathematical formulas.

    Provides @Symbolic annotation to create symbolic methods, in which you can create Layers from mathematical formulas.

    Symbolic is a dependent type class that calculates a specific Layer type according to NativeOutput. Combining with implicit-dependent-type compiler plugin, it can be treated as a type annotation in the form of NativeOutput @Symbolic, converting NativeOutput to a specific Layer type.

    @Symbolic 的三种用法

    用于符号方法的隐式参数类型

    如果某个方法的隐式类型参数标注了@Symbolic,那么这个方法就是符号方法,@Symbolic所标注的隐式参数类型是这个符号方法的输入类型。 这种情况下,NativeOutput @Symbolic会被展开为:

    Identity[NativeOutput, NativeOutput的导数类型]

    例如:

    def sumNetwork(implicit scores: INDArray @Symbolic): Double = {
      exp(scores).sum
    }

    上述代码中,由于INDArray导数类型也是INDArray,所以sumNetwork的输入类型INDArray @Symbolic展开后是Identity[INDArray, INDArray]

    用于符号方法内部变量和返回值

    在符号方法内部和返回值处,NativeOutput @Symbolic会被展开为:

    Layer.Aux[Tape.Aux[输入类型的值类型, 输入类型的导数类型], Tape.Aux[NativeOutput, NativeOutput的导数类型]]

    例如:

    def sumNetwork(implicit scores: INDArray @Symbolic): Double @Symbolic = {
      val expScores: INDArray @Symbolic = exp(scores)
      val result: Double @Symbolic = expScores.sum
      result
    }

    上述代码中,expScores的类型INDArray @Symbolic展开后是:

    Layer.Aux[Tape.Aux[INDArray, INDArray], Tape.Aux[INDArray, INDArray]]

    result的类型Double @Symbolic展开后是:

    Layer.Aux[Tape.Aux[INDArray, INDArray], Tape.Aux[Double, Double]]
    用于符号方法之外

    在符号方法之外,(NativeInput => NativeOutput) @Symbolic会被展开为:

    Layer.Aux[Tape.Aux[NativeInput, NativeInput的导数类型], Tape.Aux[NativeOutput, NativeOutput的导数类型]]

    例如:

    val predictor: (INDArray => Double) @Symbolic = sumNetwork

    上述代码中,predictor的类型(INDArray => Double) @Symbolic展开后是:

    Layer.Aux[Tape.Aux[INDArray, INDArray], Tape.Aux[Double, Double]]

    定制符号类型

    @Symbolic通过检查Symbolic.ToLiteral隐式值来确定原生类型和导数之间的映射关系。 因此,只要定义Symbolic.ToLiteral类型的隐式值,@Symbolic就可以支持定制符号类型。

    比如,假如你希望支持Short @Symbolic,其中使用Float作为Short的导数类型,那么可以这样做:

    implicit object ShortToLiteral extends ToLiteral[Short] {
      override type Data = Short
      override type Delta = Float
      override def apply(data: Short) = Literal(data)
    }
    
    def makeShortNetwork(implicit input: Short @Symbolic): Short @Symbolic = {
      input
    }
    
    val shortNetwork: (Short => Short) @Symbolic = makeShortNetwork

    这样一来shortNetwork的类型就会展开为:

    Layer.Aux[Tape.Aux[Short, Float], Tape.Aux[Short, Float]]
    Annotations
    @implicitNotFound( ... )
    See also

    Layer.Tape#Delta

    Symbolic.ToLiteral

    Symbolic.Layers.Identity

Value Members

  1. object Symbolic extends LowPrioritySymbolic

    Permalink

    There are two ways to convert a value to Layer.

    There are two ways to convert a value to Layer.

    The first way is invoke toLayer, such as:

    def createMyNeuralNetwork(implicit input: Float @Symbolic): Float @Symbolic = {
      val floatLayer: Float @Symbolic = 1.0f.toLayer
      floatLayer
    }

    The second way is autoToLayer, such as:

    def createMyNeuralNetwork(implicit input: Float @Symbolic): Float @Symbolic = {
      val floatLayer: Float @Symbolic = 1.0f
      floatLayer
    }

    In order to compile the above code through, you will need:

    import com.thoughtworks.deeplearning.Symbolic._
    import com.thoughtworks.deeplearning.Symbolic
    import com.thoughtworks.deeplearning.DifferentiableFloat._

Ungrouped