|
@@ -0,0 +1,47 @@
|
|
|
+package neuralnetworkbase
|
|
|
+
|
|
|
+import (
|
|
|
+ mat "gonum.org/v1/gonum/mat"
|
|
|
+)
|
|
|
+
|
|
|
+type NeuralNetwork struct {
|
|
|
+ Count int
|
|
|
+ Sizes []int
|
|
|
+ Biases []*mat.Dense
|
|
|
+ Weights []*mat.Dense
|
|
|
+ A []*mat.Dense
|
|
|
+ Z []*mat.Dense
|
|
|
+}
|
|
|
+
|
|
|
+func (nn *NeuralNetwork) Result() mat.Matrix {
|
|
|
+ return nn.A[nn.Count-1]
|
|
|
+}
|
|
|
+
|
|
|
+func NewNeuralNetwork(Sizes []int) (nn *NeuralNetwork) {
|
|
|
+ nn = &NeuralNetwork{}
|
|
|
+ nn.Sizes = Sizes
|
|
|
+ nn.Count = len(Sizes)
|
|
|
+ nn.Weights = make([]*mat.Dense, nn.Count)
|
|
|
+ nn.Biases = make([]*mat.Dense, nn.Count)
|
|
|
+ nn.A = make([]*mat.Dense, nn.Count)
|
|
|
+ nn.Z = make([]*mat.Dense, nn.Count)
|
|
|
+ for i := 1; i < nn.Count; i++ {
|
|
|
+ nn.Weights[i] = generateRandomDense(nn.Sizes[i], nn.Sizes[i-1])
|
|
|
+ nn.Biases[i] = generateRandomDense(nn.Sizes[i], 1)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (nn *NeuralNetwork) Forward(aIn mat.Matrix) {
|
|
|
+ nn.A[0] = mat.DenseCopyOf(aIn)
|
|
|
+
|
|
|
+ for i := 1; i < nn.Count; i++ {
|
|
|
+ nn.A[i] = mat.NewDense(nn.Sizes[i], 1, nil)
|
|
|
+ aSrc := nn.A[i-1]
|
|
|
+ aDst := nn.A[i]
|
|
|
+ aDst.Mul(nn.Weights[i], aSrc)
|
|
|
+ aDst.Add(aDst, nn.Biases[i])
|
|
|
+ nn.Z[i] = mat.DenseCopyOf(aDst)
|
|
|
+ aDst.Apply(applySigmoid, aDst)
|
|
|
+ }
|
|
|
+}
|