Alexey Edelev 5 роки тому
батько
коміт
546e4e9d5f

+ 72 - 0
neuralnetwork/datareader.go

@@ -0,0 +1,72 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"log"
+	"os"
+	"strconv"
+	"strings"
+
+	mat "gonum.org/v1/gonum/mat"
+)
+
+func readData(filename string) (dataSet, result []*mat.Dense) {
+	inputFile, err := os.Open(filename)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	defer inputFile.Close()
+
+	scanner := bufio.NewScanner(inputFile)
+	scanner.Split(bufio.ScanLines)
+
+	max := []float64{0.0, 0.0, 0.0, 0.0}
+	for scanner.Scan() {
+		dataLine := scanner.Text()
+		data := strings.Split(dataLine, ",")
+
+		if len(data) < 5 {
+			fmt.Printf("Garbage record: %s\n", dataLine)
+			continue
+		}
+
+		var dataRaw []float64
+		for i := 0; i < 4; i++ {
+			val, err := strconv.ParseFloat(data[i], 64)
+			if err != nil {
+				break
+			}
+			dataRaw = append(dataRaw, val)
+
+			if max[i] < val {
+				max[i] = val
+			}
+		}
+
+		if len(dataRaw) < 4 {
+			fmt.Printf("Garbage record: %s\n", dataLine)
+			continue
+		}
+		dataSet = append(dataSet, mat.NewDense(4, 1, dataRaw))
+
+		switch data[4] {
+		case "Iris-setosa":
+			result = append(result, mat.NewDense(3, 1, []float64{1.0, 0.0, 0.0}))
+		case "Iris-versicolor":
+			result = append(result, mat.NewDense(3, 1, []float64{0.0, 1.0, 0.0}))
+		case "Iris-virginica":
+			result = append(result, mat.NewDense(3, 1, []float64{0.0, 0.0, 1.0}))
+		}
+	}
+
+	//normalize
+	for i := 0; i < len(dataSet); i++ {
+		dataSet[i].Apply(func(r, _ int, val float64) float64 {
+			return val / max[r]
+		}, dataSet[i])
+	}
+
+	return
+}

+ 15 - 7
neuralnetwork/main.go

@@ -2,23 +2,31 @@ package main
 
 import (
 	"fmt"
-	"math/rand"
 
 	neuralnetwork "./neuralnetworkbase"
 	mat "gonum.org/v1/gonum/mat"
 )
 
 func main() {
-	sizes := []int{3, 2, 2}
+
+	dataSet, result := readData("./iris.data")
+
+	sizes := []int{4, 2, 2, 3}
 	nn := neuralnetwork.NewNeuralNetwork(sizes)
 
-	data := make([]float64, sizes[0])
-	for i := range data {
-		data[i] = rand.Float64()
+	for i := 0; i < len(dataSet); i++ {
+		fmt.Printf("Dataset[%d]:\n%v\n\n", i, mat.Formatted(dataSet[i], mat.Prefix(""), mat.Excerpt(0)))
+		fmt.Printf("Result[%d]:\n%v\n\n", i, mat.Formatted(result[i], mat.Prefix(""), mat.Excerpt(0)))
+		nn.Backward(dataSet[i], result[i])
 	}
-	aIn := mat.NewDense(sizes[0], 1, data)
 
-	max, index := nn.Predict(aIn)
+	// data := make([]float64, sizes[0])
+	// for i := range data {
+	// 	data[i] = rand.Float64()
+	// }
+	// aIn := mat.NewDense(sizes[0], 1, data)
+
+	max, index := nn.Predict(dataSet[0])
 
 	for i := 0; i < nn.Count; i++ {
 		if i > 0 {

+ 1 - 0
neuralnetwork/neuralnetworkbase/neuralnetwork.go

@@ -57,6 +57,7 @@ func (nn *NeuralNetwork) Forward(aIn mat.Matrix) {
 		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)