class NeuralNetwork

Attributes

biases[RW]
names[RW]
neurons[RW]
weights[RW]

Public Class Methods

from_hash(hash) click to toggle source
# 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
new(sizes) click to toggle source
# 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

Public Instance Methods

[](name) click to toggle source
# File lib/neural-network.rb, line 88
def [](name)
  @neurons[@names[name][0]][@names[name][1]]
end
[]=(name, value) click to toggle source
# File lib/neural-network.rb, line 91
def []=(name, value)
  @neurons[@names[name][0]][@names[name][1]] = value
end
feed_forward() click to toggle source
# 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
inputs() click to toggle source
# File lib/neural-network.rb, line 67
def inputs
  @neurons.length > 0 ? @neurons[0] : []
end
name_neuron(i, j, name) click to toggle source
# File lib/neural-network.rb, line 85
def name_neuron(i, j, name)
  @names[name] = [i, j]
end
outputs() click to toggle source
# File lib/neural-network.rb, line 64
def outputs
  @neurons.length > 0 ? @neurons[-1] : []
end
sizes() click to toggle source
# File lib/neural-network.rb, line 94
def sizes
  s = []
  @neurons.each do |layer|
    s << layer.length
  end
  s
end
think() click to toggle source
# File lib/neural-network.rb, line 70
def think
  feed_forward
end
to_hash() click to toggle source
# 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

Private Instance Methods

sigmoid(x) click to toggle source
# File lib/neural-network.rb, line 104
def sigmoid(x)
  1.0 / (1.0 + Math::E ** (-x.to_f))
end