Как я могу сохранить информацию о слое в таблице слоев

Я только начал изучать Lua (5.4) и хотел ООП нейронной сети (раньше я делал это на Python). Однако, когда я тестировал свой класс Layer, у меня были некоторые странные результаты. В моей таблице одинаковое содержимое для каждой строки в таблице. Мой код выглядит следующим образом:

math.randomseed(os.time())
  

-- Creates random value between lower and upper bounds
-- the function could be better, but it works good enough for this
local function randbetween(lower_limit, upper_limit)
    local treshold = 0.5
    local value = math.random()
    if value < treshold then return math.random() * lower_limit
    elseif value >= treshold then return math.random() * upper_limit end
end

-- A single Neuron within a neural network
local Neuron = {}

function Neuron:init(numberOfInputs)
    self.numberOfInputs = numberOfInputs
    self.weights = {}
    for i = 1,numberOfInputs,1 do self.weights[i] = randbetween(-1, 1) end
    self.bias = randbetween(-1,1)
    return self
end

-- A single layer within the neural network
local Layer = {}

function Layer:init(numberOfNeurons, numberOfInputsPerNeuron)
    self.numberOfNeurons = numberOfNeurons
    self.neurons = {}
    for i = 1,numberOfInputsPerNeuron,1 do
        self.neurons[i] = Neuron:init(numberOfInputsPerNeuron)
    end
    return self
end

local L = {}

L[1] = Layer:init(2,0)
L[2] = Layer:init(3, 2)
for k,v in pairs(L) do print(k,v) end

Это мой результат:

1   table: 000002AB12D5D7D0
2   table: 000002AB12D5D7D0

L [1] должен иметь numberOfNeurons = 2, поэтому я ожидаю что-то в этой строке:

init    function: 000001E022968760
neurons table: 000001E02297D6E0
numberOfNeurons 2

Однако он возвращает:

init    function: 000001E022968760
neurons table: 000001E02297D6E0
numberOfNeurons 3

Что идентично L [2].

Это наводит меня на мысль, что все строки таблицы перезаписываются последней записью.

Есть ли способ исправить это или я что-то делаю не так? Я подозреваю, что это происходит из-за того, что я не использую метатаблицы, но не знаю, проблема ли в этом.


person PVDL23    schedule 11.02.2021    source источник
comment
ваша init функция должна создать новый объект, self в этой области Layer относится к таблице, а не к уникальному объекту. эти вопросы и ответы могут вам помочь: stackoverflow.com/ questions / 65561981 /   -  person Nifim    schedule 11.02.2021
comment
@Nifim, спасибо за ссылку на этот вопрос и ответ. Это устранило мою проблему.   -  person PVDL23    schedule 11.02.2021