Provides @Symbolic annotation to create symbolic methods, in which you can create Layers from mathematical formulas.
Symbolic is a dependenttype 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.
Three usages of @Symbolic
Implicit parameter types used for symbol methods
In case that the implicit parameter of an method is marked with @Symbolic, then this method is symbol method. The implicit parameter type marked with @Symbolic is the input type of this symbol method.
In this case, NativeOutput @Symbolic will be expanded as:
Identity[NativeOutput, Derivative type of NativeOutput]
In the above code, because the derivative type of INDArray is also INDArray, the input type INDArray @Symbolic of sumNetwork, once expanded, is Identity[INDArray, INDArray]
Used for symbol method internal variable and return value
A NativeOutput @Symbolic inside a symbol method, or at the return position of a symbol method, will be expanded as:
Layer.Aux[Tape.Aux[value type of input type, derivative type of input type], Tape.Aux[NativeOutput, derivative type of NativeOutput]]
For example:
def sumNetwork(implicit scores: INDArray @Symbolic): Double @Symbolic = {
val expScores: INDArray @Symbolic = exp(scores)
val result: Double @Symbolic = expScores.sum
result
}
In the above code, the type INDArray @Symbolic of expScores is expanded as:
The @Symbolic determines the mapping relation between the primitive type and derivative by checking Symbolic.ToLiteral implicit value. Therefore, @Symbolic can be a custom symbol type once you define your own the implicit Symbolic.ToLiteral.
For example, if you want to support Short @Symbolic, using Float as the derivative type of Short, then you can conduct the follows:
implicitobject ShortToLiteral extends ToLiteral[Short] {
overridetype Data = Shortoverridetype Delta = Floatoverridedef apply(data: Short) = Literal(data)
}
def makeShortNetwork(implicit input: Short @Symbolic): Short @Symbolic = {
input
}
val shortNetwork: (Short=>Short) @Symbolic = makeShortNetwork
This member is added by an implicit conversion from Symbolic[NativeOutput] to
any2stringadd[Symbolic[NativeOutput]] performed by method any2stringadd in scala.Predef.
This member is added by an implicit conversion from Symbolic[NativeOutput] to
ArrowAssoc[Symbolic[NativeOutput]] performed by method ArrowAssoc in scala.Predef.
This member is added by an implicit conversion from Symbolic[NativeOutput] to
Ensuring[Symbolic[NativeOutput]] performed by method Ensuring in scala.Predef.
This member is added by an implicit conversion from Symbolic[NativeOutput] to
Ensuring[Symbolic[NativeOutput]] performed by method Ensuring in scala.Predef.
This member is added by an implicit conversion from Symbolic[NativeOutput] to
Ensuring[Symbolic[NativeOutput]] performed by method Ensuring in scala.Predef.
This member is added by an implicit conversion from Symbolic[NativeOutput] to
Ensuring[Symbolic[NativeOutput]] performed by method Ensuring in scala.Predef.
This member is added by an implicit conversion from Symbolic[NativeOutput] to
StringFormat[Symbolic[NativeOutput]] performed by method StringFormat in scala.Predef.
Definition Classes
StringFormat
Annotations
@inline()
defforward: ((input: _778.Input)_778.Output) forSome {val _778: Layer { ... /* 2 definitions in type refinement */ }}
Implicit information
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.
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.
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.
This member is added by an implicit conversion from Symbolic[NativeOutput] to
ArrowAssoc[Symbolic[NativeOutput]] performed by method ArrowAssoc in scala.Predef.
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 toNativeOutput
. Combining with implicit-dependent-type compiler plugin, it can be treated as a type annotation in the form ofNativeOutput @Symbolic
, convertingNativeOutput
to a specific Layer type.Three usages of
@Symbolic
Implicit parameter types used for symbol methods
In case that the implicit parameter of an method is marked with
@Symbolic
, then this method is symbol method. The implicit parameter type marked with@Symbolic
is the input type of this symbol method. In this case,NativeOutput @Symbolic
will be expanded as:Identity[NativeOutput, Derivative type of NativeOutput]
For example:
In the above code, because the derivative type of
INDArray
is alsoINDArray
, the input typeINDArray @Symbolic
ofsumNetwork
, once expanded, isIdentity[INDArray, INDArray]
Used for symbol method internal variable and return value
A
NativeOutput @Symbolic
inside a symbol method, or at the return position of a symbol method, will be expanded as:For example:
In the above code, the type
INDArray @Symbolic
ofexpScores
is expanded as:The type
Double @Symbolic
ofresult
is expanded as:Used for cases excluding symbol method
(NativeInput => NativeOutput) @Symbolic
outside a symbol method, will be expanded as:For example:
In the above code, type
(INDArray => Double) @Symbolic
ofpredictor
is expanded as:Custom symbol type
The
@Symbolic
determines the mapping relation between the primitive type and derivative by checking Symbolic.ToLiteral implicit value. Therefore,@Symbolic
can be a custom symbol type once you define your own the implicit Symbolic.ToLiteral.For example, if you want to support
Short @Symbolic
, using Float as the derivative type of Short, then you can conduct the follows:Thus, type of
shortNetwork
is expanded as:Layer.Tape#Delta
Symbolic.ToLiteral
Symbolic.Layers.Identity