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.



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

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.



2
3
4
# File 'lib/neural-network.rb', line 2

def biases
  @biases
end

#namesObject

Returns the value of attribute names.



2
3
4
# File 'lib/neural-network.rb', line 2

def names
  @names
end

#neuronsObject

Returns the value of attribute neurons.



2
3
4
# File 'lib/neural-network.rb', line 2

def neurons
  @neurons
end

#weightsObject

Returns the value of attribute weights.



2
3
4
# File 'lib/neural-network.rb', line 2

def weights
  @weights
end

Class Method Details

.from_hash(hash) ⇒ Object



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

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



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

def feed_forward
  zs = []
  (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
    zs << outputs
    (0..@neurons[i].length - 1).each do |j|
      @neurons[i][j] = Util.sigmoid(outputs[j, 0])
    end
  end
  outputs
end

#inputsObject



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

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



62
63
64
# File 'lib/neural-network.rb', line 62

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



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

def think
  feed_forward
end

#to_hashObject



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

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