Может ответ и не по теме, но так нифига не делаются дела. Надеюсь, ты перепишешь этот ужас))
Я, конечно, когда давно интересовался нейронными сетями, но было лень читать кучу статей тоже думал, что надо создавать класс для отдельного нейрона, но, блин, какой же это бред,
1) Берешь, ставишь numpy
Задать матрицу весов можно таким образом:
weights_1 = np.random.randn(input_num, hidden_neurons)
b1 = np.random.randn(hidden_neurons)
weights_hidden = np.random.randn(hidden_neurons, output_n)
b2 = np.random.randn(output_n)
Где input_num - количество входных нейронов, hidden_neurons - скрытых нейронов.
Тогда ты имеешь матрицу где для каждого нейрона задаешь вектор весов его связей. Например, если входных нейронов - 10, а скрытых - 64, то матрица размера 10x64
Тогда получить выходной вектор со скрытого слоя можно очень просто
hidden_out = np.dot(X, weights_1) + b1
И таким же образом на выходной
>>> output = np.dot(hidden_out, weights_hidden) + b2 # где получаем выходное значение, в данном примере output_n = 1
>>> output.shape
(1,)
>>> output
array([ 199.52290173])
Получили значение на выходном нейроне. Теперь надо это дело обучать.
Надеюсь, понятно объяснил как правильно задавать нейронные сети?)
В примере я не юзал функции активации, но они делаются также просто. Просто допиши к вычислениям каждого аутпута функцию активации, например, relu-активацию
hidden_out = np.max(0, np.dot(X, weights_1) + b1)
Забудь, пожалуйста, про ту жесть что ты написал. Без обид, сам таким был)