brainy 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/brainy/network.rb +17 -11
- data/lib/brainy/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fd74abee11cdbbf0e0b79f302134fe7722ed67f
|
4
|
+
data.tar.gz: f867df45585f08ae396bee5799b74f611bcbb225
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3cc3538aa573f9097ce3cebfe5a6d439ed580077b58ea93f5d1771d409f1d02fc9efc148110a58082665faa4f246a5ba781df6cca153d2b1f303d4b5752038f6
|
7
|
+
data.tar.gz: e44212b55f265290610ad81d03f79c12ee0cc0e47a34e7745491dfa49bea272d525fa600a0d8cfd7fb76076f1fdf1fbaecb30061421ef1bb258e9118ace20207
|
data/README.md
CHANGED
data/lib/brainy/network.rb
CHANGED
@@ -4,26 +4,32 @@ module Brainy
|
|
4
4
|
|
5
5
|
def initialize(input_count, hidden_count, output_count, learning_rate)
|
6
6
|
@layers = [
|
7
|
-
Array.new(hidden_count
|
8
|
-
Array.new(output_count
|
7
|
+
Array.new(hidden_count) { Vector.elements(Array.new(input_count + 1) { rand(-1.0..1.0) }) },
|
8
|
+
Array.new(output_count) { Vector.elements(Array.new(hidden_count + 1) { rand(-1.0..1.0) }) }
|
9
9
|
]
|
10
10
|
@learning_rate = learning_rate
|
11
|
-
|
12
|
-
|
11
|
+
end
|
12
|
+
|
13
|
+
def activate(x)
|
14
|
+
1 / (1 + Math.exp(-1 * x))
|
15
|
+
end
|
16
|
+
|
17
|
+
def activate_prime(x)
|
18
|
+
x * (1 - x)
|
13
19
|
end
|
14
20
|
|
15
21
|
def evaluate(inputs)
|
16
22
|
@layers.reduce(Vector.elements(inputs)) do |input, layer|
|
17
|
-
input = Vector.elements(input.to_a + [1])
|
18
|
-
output = layer.map { |node|
|
23
|
+
input = Vector.elements(input.to_a + [1.0])
|
24
|
+
output = layer.map { |node| activate(node.inner_product(input)) }
|
19
25
|
Vector.elements(output)
|
20
26
|
end
|
21
27
|
end
|
22
28
|
|
23
29
|
def train!(inputs, expected)
|
24
|
-
inputs = Vector.elements(inputs + [1])
|
25
|
-
hidden_outs = Vector.elements(@layers.first.map { |node|
|
26
|
-
output_outs = Vector.elements(@layers.last.map { |node|
|
30
|
+
inputs = Vector.elements(inputs + [1.0])
|
31
|
+
hidden_outs = Vector.elements(@layers.first.map { |node| activate(node.inner_product(inputs)) } + [1.0])
|
32
|
+
output_outs = Vector.elements(@layers.last.map { |node| activate(node.inner_product(hidden_outs)) })
|
27
33
|
output_deltas = get_output_deltas(expected, output_outs)
|
28
34
|
hidden_deltas = get_hidden_deltas(hidden_outs, @layers.last, output_deltas)
|
29
35
|
@layers[1] = get_updated_weights(@layers.last, hidden_outs, output_deltas)
|
@@ -32,14 +38,14 @@ module Brainy
|
|
32
38
|
|
33
39
|
def get_output_deltas(expected, output)
|
34
40
|
expected.zip(output.to_a).map do |expect, out|
|
35
|
-
(out - expect) *
|
41
|
+
(out - expect) * activate_prime(out)
|
36
42
|
end
|
37
43
|
end
|
38
44
|
|
39
45
|
def get_hidden_deltas(hidden_outs, output_nodes, output_deltas)
|
40
46
|
hidden_outs.each_with_index.map do |out, index|
|
41
47
|
error = output_nodes.zip(output_deltas).map { |weights, delta| weights[index] * delta }.reduce(:+)
|
42
|
-
error *
|
48
|
+
error * activate_prime(out)
|
43
49
|
end
|
44
50
|
end
|
45
51
|
|
data/lib/brainy/version.rb
CHANGED