Browse Source

Initial commit

Alexey Edelev 5 years ago
commit
e3b4d4706b

+ 10 - 0
build.sh

@@ -0,0 +1,10 @@
+export GOPATH=$PWD
+export PATH=$PATH:$PWD/bin
+export GOBIN=$PWD/bin
+
+cd neuralnetwork
+
+go get -v
+go build -o $GOBIN/neuralnetwork
+#go test -v
+#go test -cover

+ 31 - 0
neuralnetwork/main.go

@@ -0,0 +1,31 @@
+package main
+
+import (
+	"fmt"
+	"math/rand"
+
+	neuralnetwork "./neuralnetworkbase"
+	mat "gonum.org/v1/gonum/mat"
+)
+
+func main() {
+	sizes := []int{3, 2, 2}
+	nn := neuralnetwork.NewNeuralNetwork(sizes)
+
+	data := make([]float64, sizes[0])
+	for i := range data {
+		data[i] = rand.Float64()
+	}
+	aIn := mat.NewDense(sizes[0], 1, data)
+
+	nn.Forward(aIn)
+
+	for i := 0; i < nn.Count; i++ {
+		if i > 0 {
+			fmt.Printf("Weights:\n%v\n\n", mat.Formatted(nn.Weights[i], mat.Prefix(""), mat.Excerpt(0)))
+			fmt.Printf("Biases:\n%v\n\n", mat.Formatted(nn.Biases[i], mat.Prefix(""), mat.Excerpt(0)))
+			fmt.Printf("Z:\n%v\n\n", mat.Formatted(nn.Z[i], mat.Prefix(""), mat.Excerpt(0)))
+		}
+		fmt.Printf("A:\n%v\n\n", mat.Formatted(nn.A[i], mat.Prefix(""), mat.Excerpt(0)))
+	}
+}

+ 24 - 0
neuralnetwork/neuralnetworkbase/common.go

@@ -0,0 +1,24 @@
+package neuralnetworkbase
+
+import (
+	math "math"
+	rand "math/rand"
+
+	mat "gonum.org/v1/gonum/mat"
+)
+
+func generateRandomDense(rows, columns int) *mat.Dense {
+	data := make([]float64, rows*columns)
+	for i := range data {
+		data[i] = rand.NormFloat64()
+	}
+	return mat.NewDense(rows, columns, data)
+}
+
+func applySigmoid(_, _ int, x float64) float64 {
+	return sigmoid(x)
+}
+
+func sigmoid(x float64) float64 {
+	return 1.0 / (1.0 + math.Exp(-x))
+}

+ 47 - 0
neuralnetwork/neuralnetworkbase/neuralnetwork.go

@@ -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)
+	}
+}