Class: NeuralNetwork

Inherits:
Object
  • Object
show all
Defined in:
lib/neural-network.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sizes) ⇒ NeuralNetwork

Returns a new instance of NeuralNetwork.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/neural-network.rb', line 5

def initialize(sizes)
  @weights = []
  @biases = []
  @neurons = []
  @names = {}
  @@rng = Distribution::Normal.rng
  num_layers = sizes.length
  (0..num_layers - 1).each do |i|
    @neurons << []
    unless i == 0
      @biases << []
      @weights << []
    end
    (0..sizes[i] - 1).each do |j|
      @neurons[-1] << 0.0
      unless i == 0
        @biases[-1] << @@rng.call
        @weights[-1] << []
        (0..sizes[i - 1] - 1).each do |k|
          @weights[-1][j] << @@rng.call
        end
      end
    end
  end
end

Instance Attribute Details

#biasesObject

Returns the value of attribute biases.



4
5
6
# File 'lib/neural-network.rb', line 4

def biases
  @biases
end

#namesObject

Returns the value of attribute names.



4
5
6
# File 'lib/neural-network.rb', line 4

def names
  @names
end

#neuronsObject

Returns the value of attribute neurons.



4
5
6
# File 'lib/neural-network.rb', line 4

def neurons
  @neurons
end

#weightsObject

Returns the value of attribute weights.



4
5
6
# File 'lib/neural-network.rb', line 4

def weights
  @weights
end

Class Method Details

.from_hash(hash) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/neural-network.rb', line 41

def self.from_hash(hash)
  sizes = []
  hash['neurons'].each do |layer|
    sizes << layer.length
  end
  n = NewNeuralNetwork.new(sizes)
  (0..n.neurons.length - 1).each do |i|
    (0..n.neurons[i].length - 1).each do |j|
      n.neurons[i][j] = hash['neurons'][i][j]
    end
  end
  (0..n.weights.length - 1).each do |i|
    (0..n.weights[i].length - 1).each do |j|
      (0..n.neurons[i].length - 1).each do |k|
        n.weights[i][j][k] = hash['weights'][i][j][k]
      end
    end
  end
  hash['names'].each do |key, value|
    n.names[key] = value
  end
  n
end

Instance Method Details

#[](name) ⇒ Object



88
89
90
# File 'lib/neural-network.rb', line 88

def [](name)
  @neurons[@names[name][0]][@names[name][1]]
end

#[]=(name, value) ⇒ Object



91
92
93
# File 'lib/neural-network.rb', line 91

def []=(name, value)
  @neurons[@names[name][0]][@names[name][1]] = value
end

#feed_forwardObject



73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/neural-network.rb', line 73

def feed_forward
  (1..@neurons.length - 1).each do |i|
    a = Matrix.rows(@weights[i - 1], false)
    b = Matrix.columns([@neurons[i - 1]])
    c = Matrix.columns([@biases[i - 1]])
    outputs = a * b + c
    (0..@neurons[i].length - 1).each do |j|
      @neurons[i][j] = sigmoid(outputs[j, 0])
    end
  end
  outputs
end

#inputsObject



67
68
69
# File 'lib/neural-network.rb', line 67

def inputs
  @neurons.length > 0 ? @neurons[0] : []
end

#name_neuron(i, j, name) ⇒ Object



85
86
87
# File 'lib/neural-network.rb', line 85

def name_neuron(i, j, name)
  @names[name] = [i, j]
end

#outputsObject



64
65
66
# File 'lib/neural-network.rb', line 64

def outputs
  @neurons.length > 0 ? @neurons[-1] : []
end

#sizesObject



94
95
96
97
98
99
100
# File 'lib/neural-network.rb', line 94

def sizes
  s = []
  @neurons.each do |layer|
    s << layer.length
  end
  s
end

#thinkObject



70
71
72
# File 'lib/neural-network.rb', line 70

def think
  feed_forward
end

#to_hashObject



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/neural-network.rb', line 30

def to_hash
  hash = {}
  hash['weights'] = Marshal.load(Marshal.dump(@weights))
  hash['biases'] = Marshal.load(Marshal.dump(@biases))
  hash['neurons'] = Marshal.load(Marshal.dump(@neurons))
  hash['names'] = {}
  names.each do |key, value|
    hash['names'][key] = value
  end
  hash
end