1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- 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)
- }
- }
|