class RANN::LSTM

Attributes

inputs[R]
name[R]
network[R]
outputs[R]

Public Class Methods

new(name, size) click to toggle source
# File lib/rann/lstm.rb, line 11
def initialize name, size
  @name    = name
  @network = RANN::Network.new
  @inputs  = []
  @outputs = []
  @size    = size
  init
end

Public Instance Methods

add_input(neuron) click to toggle source
# File lib/rann/lstm.rb, line 73
def add_input neuron
  @inputs.each do |input|
    @network.add RANN::Connection.new neuron, input
  end
end
init() click to toggle source
# File lib/rann/lstm.rb, line 20
def init
  @size.times do |j|
    input = RANN::Neuron.new("LSTM #{name} Input #{j}", 0, :standard, :linear).tap{ |n| @network.add n }
    @inputs << input

    f = RANN::Neuron.new("LSTM #{name} F #{j}", 3, :standard, :sig).tap{ |n| @network.add n }
    i = RANN::Neuron.new("LSTM #{name} I #{j}", 4, :standard, :sig).tap{ |n| @network.add n }
    g = RANN::Neuron.new("LSTM #{name} G #{j}", 3, :standard, :tanh).tap{ |n| @network.add n }
    o = RANN::Neuron.new("LSTM #{name} O #{j}", 3, :standard, :sig).tap{ |n| @network.add n }
    bias_f = RANN::Neuron.new("LSTM #{name} Bias F #{j}", 0, :bias).tap{ |n| @network.add n }
    bias_i = RANN::Neuron.new("LSTM #{name} Bias I #{j}", 0, :bias).tap{ |n| @network.add n }
    bias_g = RANN::Neuron.new("LSTM #{name} Bias G #{j}", 0, :bias).tap{ |n| @network.add n }
    bias_o = RANN::Neuron.new("LSTM #{name} Bias O #{j}", 0, :bias).tap{ |n| @network.add n }
    memory_product = RANN::ProductNeuron.new("LSTM #{name} Mem Product #{j}", 2, :standard, :linear).tap{ |n| @network.add n }
    i_g_product = RANN::ProductNeuron.new("LSTM #{name} Hidden 2/3 Product #{j}", 2, :standard, :linear).tap{ |n| @network.add n }
    memory_standard = RANN::Neuron.new("LSTM #{name} Mem Standard #{j}", 2, :standard, :linear).tap{ |n| @network.add n }
    memory_tanh = RANN::Neuron.new("LSTM #{name} Mem Tanh #{j}", 1, :standard, :tanh).tap{ |n| @network.add n }
    memory_o_product = RANN::ProductNeuron.new("LSTM #{name} Mem/Hidden 4 Product #{j}", 2, :standard, :linear).tap{ |n| @network.add n }
    @outputs << memory_o_product
    memory_context =
      RANN::Neuron.new("LSTM #{name} Mem Context #{j}", 1, :context).tap do |n|
        @network.add n
        n.value = 1.to_d # connecting to a product neuron
      end
    output_context = RANN::Neuron.new("LSTM #{name} Output Context #{j}", 1, :context).tap{ |n| @network.add n }

    @network.add RANN::Connection.new input, f
    @network.add RANN::Connection.new input, i
    @network.add RANN::Connection.new input, g
    @network.add RANN::Connection.new input, o
    @network.add RANN::LockedConnection.new f, memory_product, 1.to_d
    @network.add RANN::LockedConnection.new i, i_g_product, 1.to_d
    @network.add RANN::LockedConnection.new g, i_g_product, 1.to_d
    @network.add RANN::LockedConnection.new i_g_product, memory_standard, 1.to_d
    @network.add RANN::LockedConnection.new memory_product, memory_standard, 1.to_d
    @network.add RANN::LockedConnection.new memory_standard, memory_tanh, 1.to_d
    @network.add RANN::LockedConnection.new o, memory_o_product, 1.to_d
    @network.add RANN::LockedConnection.new memory_tanh, memory_o_product, 1.to_d
    @network.add RANN::LockedConnection.new memory_standard, memory_context, 1.to_d
    @network.add RANN::LockedConnection.new memory_context, memory_product, 1.to_d
    @network.add RANN::LockedConnection.new memory_context, i, 1.to_d
    @network.add RANN::LockedConnection.new memory_o_product, output_context, 1.to_d
    @network.add RANN::Connection.new output_context, f
    @network.add RANN::Connection.new output_context, i
    @network.add RANN::Connection.new output_context, g
    @network.add RANN::Connection.new output_context, o
    @network.add RANN::Connection.new bias_f, f
    @network.add RANN::Connection.new bias_i, i
    @network.add RANN::Connection.new bias_g, g
    @network.add RANN::Connection.new bias_o, o
  end
end