class Mirlo::NeuronLayer

Attributes

activations[RW]
build_weight_function[RW]
errors[RW]
previous_layer[RW]
size[RW]

Public Class Methods

new(size) click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 4
def initialize(size)
  @size = size
  @errors = Array.new(size, 0)
end

Public Instance Methods

activation_function(input) click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 26
def activation_function(input)
  1.0/(1 + Math.exp(-input))
end
activation_matrix() click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 18
def activation_matrix
  inputs_matrix.collect { |i| activation_function(i) }
end
build_weight() click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 50
def build_weight
  @build_weight_function ? @build_weight_function.call : rand(-0.5..0.5)
end
calculate_activations() click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 14
def calculate_activations
  @activations = activation_matrix
end
error_matrix() click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 22
def error_matrix
  Matrix.row_vector(@errors)
end
inputs_matrix() click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 9
def inputs_matrix
  # debugger
  previous_layer.activation_matrix * weights
end
update_weights(learning_rate, momentum = 0) click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 34
def update_weights(learning_rate, momentum = 0)
  has_momentum = @weights_update && momentum > 0

  if has_momentum
    momentum_matrix = @weights_update.collect { |u| u * momentum }
  end

  @weights_update = learning_rate * (previous_layer.activation_matrix.transpose * errors)

  if has_momentum
    @weights_update = @weights_update + momentum_matrix
  end

  @weights = @weights + @weights_update
end
weights() click to toggle source
# File lib/mirlo/ann/neuron_layer.rb, line 30
def weights
  @weights ||= Matrix.build(previous_layer.size, size) { build_weight }
end