class Noggin::Network

Constants

DEFAULTS

Attributes

forward_input[RW]
forward_output[RW]
layers[RW]
options[RW]

Public Class Methods

new(**opts) click to toggle source
# File lib/noggin/network.rb, line 15
def initialize **opts
  @options = DEFAULTS.merge opts
  @layers = []
  @ready = false
end

Public Instance Methods

input_set_size() click to toggle source
# File lib/noggin/network.rb, line 119
def input_set_size
  forward_input.first[:input].size
end
pretty_print() click to toggle source
# File lib/noggin/network.rb, line 123
def pretty_print
  Noggin::PrettyPrinter.print_network self
end
run(input) click to toggle source
# File lib/noggin/network.rb, line 41
def run input
  setup_input input
  run_forwards input
  layers.last.neurons.first.forward_output
end
run_backwards() click to toggle source
# File lib/noggin/network.rb, line 56
def run_backwards
  layers.reverse[1..-1].each(&:backward_activate!)
end
run_for_error(input) click to toggle source
# File lib/noggin/network.rb, line 47
def run_for_error input
  run_forwards input
  layers.last.neurons.inject(0){ |sum, neuron| sum += neuron.forward_error_output }
end
run_forwards(input) click to toggle source
# File lib/noggin/network.rb, line 52
def run_forwards input
  layers[1..-1].each(&:forward_activate!)
end
setup_backwards() click to toggle source
# File lib/noggin/network.rb, line 108
def setup_backwards
  layers.last.neurons.each do |output_neuron|
    output_neuron.backward_activate_error!
    output_neuron.backward_activate!
  end
end
setup_expected(expected) click to toggle source
# File lib/noggin/network.rb, line 115
def setup_expected expected
  layers.last.neurons.each { |neuron| neuron.expected = expected }
end
setup_hidden_layers() click to toggle source
# File lib/noggin/network.rb, line 82
def setup_hidden_layers
  options[:hidden_layer_size].times do |i|
    hidden_layer = Layer.new
    hidden_layer.neurons = Array.new(options[:hidden_layer_node_size]){ Noggin::Neuron.new }
    Noggin::Layer.connect_layers layers.last, hidden_layer, options[:momentum]
    layers << hidden_layer
  end
end
setup_input(set) click to toggle source
# File lib/noggin/network.rb, line 98
def setup_input set
  layers.first.neurons.each_with_index do |neuron, i|
    neuron.forward_input = neuron.forward_output = set[i]
    neuron.dests.each do |edge|
      edge.forward_input = neuron.forward_output
      edge.forward_activate!
    end
  end
end
setup_input_layer() click to toggle source
# File lib/noggin/network.rb, line 76
def setup_input_layer
  input_layer = Layer.new
  input_layer.neurons = Array.new(input_set_size){ Noggin::Neuron.new }
  layers << input_layer
end
setup_layers() click to toggle source
# File lib/noggin/network.rb, line 69
def setup_layers
  setup_input_layer
  setup_hidden_layers
  setup_output_layer
  @ready = true
end
setup_output_layer() click to toggle source
# File lib/noggin/network.rb, line 91
def setup_output_layer
  output_layer = Layer.new
  output_layer.neurons = [ Noggin::Neuron.new ]
  Noggin::Layer.connect_layers layers.last, output_layer, options[:momentum]
  layers << output_layer
end
train(data_set) click to toggle source
# File lib/noggin/network.rb, line 21
def train data_set
  @forward_input = data_set
  setup_layers unless @ready
  error = Float::INFINITY
  laps = 0
  until laps >= options[:training_laps] || error < options[:min_training_error] do
    laps += 1
    error = 0
    data_set.each do |set|
      setup_input set[:input]
      setup_expected set[:expected]
      error += run_for_error set[:input]
      setup_backwards
      run_backwards
      update_weights
    end
  end
  { total_error: error, training_laps_needed: laps }
end
update_weights() click to toggle source
# File lib/noggin/network.rb, line 60
def update_weights
  layers.each do |layer|
    layer.bias.learn! if layer.bias
    layer.neurons.each do |neuron|
      neuron.dests.each(&:learn!)
    end
  end
end