trait Symbolic[NativeOutput] extends AnyRef
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
- Alphabetic
- By Inheritance
- Symbolic
- AnyRef
- Any
- by autoToLayer
- by ToTapeOps
- by ToLayerOps
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- All
Type Members
- abstract type @ <: Layer
Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
- def +(other: String): String
- def ->[B](y: B): (Symbolic[NativeOutput], B)
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
- def ensuring(cond: (Symbolic[NativeOutput]) ⇒ Boolean, msg: ⇒ Any): Symbolic[NativeOutput]
- def ensuring(cond: (Symbolic[NativeOutput]) ⇒ Boolean): Symbolic[NativeOutput]
- def ensuring(cond: Boolean, msg: ⇒ Any): Symbolic[NativeOutput]
- def ensuring(cond: Boolean): Symbolic[NativeOutput]
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
- def formatted(fmtstr: String): String
-
def
forward: ((input: _1.Input)_1.Output) forSome {val _1: Layer { ... /* 2 definitions in type refinement */ }}
- Implicit
- This member is added by an implicit conversion from Symbolic[NativeOutput] to Aux[Input, Aux[OutputData, OutputDelta]] performed by method autoToLayer in com.thoughtworks.deeplearning.Symbolic. This conversion will take place only if an implicit value of type Aux[Symbolic[NativeOutput], Input, OutputData, OutputDelta] is in scope.
- Definition Classes
- Layer
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toLayer: Aux[Input, Aux[OutputData, OutputDelta]]
- Implicit
- This member is added by an implicit conversion from Symbolic[NativeOutput] to ToLayerOps[Symbolic[NativeOutput], Input, OutputData, OutputDelta] performed by method ToLayerOps in com.thoughtworks.deeplearning.Symbolic. This conversion will take place only if an implicit value of type Aux[Symbolic[NativeOutput], Input, OutputData, OutputDelta] is in scope.
- Definition Classes
- ToLayerOps
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
def
toTape: Aux[Data, Delta]
- Implicit
- This member is added by an implicit conversion from Symbolic[NativeOutput] to ToTapeOps[Symbolic[NativeOutput], Data, Delta] performed by method ToTapeOps in com.thoughtworks.deeplearning.Symbolic. This conversion will take place only if an implicit value of type Aux[Symbolic[NativeOutput], Data, Delta] is in scope.
- Definition Classes
- ToTapeOps
- Annotations
- @inline()
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
- def →[B](y: B): (Symbolic[NativeOutput], B)