package deeplearning
- Alphabetic
- Public
- All
Type Members
-
trait
Symbolic
[NativeOutput] extends AnyRef
Provides
@Symbolicannotation to create symbolic methods, in which you can create Layers from mathematical formulas.Provides
@Symbolicannotation to create symbolic methods, in which you can create Layers from mathematical formulas.Symbolicis 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, convertingNativeOutputto 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
Value Members
-
object
Symbolic
extends LowPrioritySymbolic
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._