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._
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