neuralnetwork.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package neuralnetworkbase
  2. import (
  3. mat "gonum.org/v1/gonum/mat"
  4. )
  5. type NeuralNetwork struct {
  6. Count int
  7. Sizes []int
  8. Biases []*mat.Dense
  9. Weights []*mat.Dense
  10. A []*mat.Dense
  11. Z []*mat.Dense
  12. }
  13. func (nn *NeuralNetwork) Result() mat.Matrix {
  14. return nn.A[nn.Count-1]
  15. }
  16. func NewNeuralNetwork(Sizes []int) (nn *NeuralNetwork) {
  17. nn = &NeuralNetwork{}
  18. nn.Sizes = Sizes
  19. nn.Count = len(Sizes)
  20. nn.Weights = make([]*mat.Dense, nn.Count)
  21. nn.Biases = make([]*mat.Dense, nn.Count)
  22. nn.A = make([]*mat.Dense, nn.Count)
  23. nn.Z = make([]*mat.Dense, nn.Count)
  24. for i := 1; i < nn.Count; i++ {
  25. nn.Weights[i] = generateRandomDense(nn.Sizes[i], nn.Sizes[i-1])
  26. nn.Biases[i] = generateRandomDense(nn.Sizes[i], 1)
  27. }
  28. return
  29. }
  30. func (nn *NeuralNetwork) Forward(aIn mat.Matrix) {
  31. nn.A[0] = mat.DenseCopyOf(aIn)
  32. for i := 1; i < nn.Count; i++ {
  33. nn.A[i] = mat.NewDense(nn.Sizes[i], 1, nil)
  34. aSrc := nn.A[i-1]
  35. aDst := nn.A[i]
  36. aDst.Mul(nn.Weights[i], aSrc)
  37. aDst.Add(aDst, nn.Biases[i])
  38. nn.Z[i] = mat.DenseCopyOf(aDst)
  39. aDst.Apply(applySigmoid, aDst)
  40. }
  41. }