@raw1

Почему в массив объектов добавляется только последний объект созданный в цикле?

def create_neiron(self):

		for x in range(1, self.number_neirons + 1):
			weight = random.random()

			this = self.neiron
			this.weight = weight
			self.neirons.append(this)

Эта функция выводит два одинаковы значения (first это объект созданный классом network)
for x in first.neirons:
	print(x.weight)
  • Вопрос задан
  • 326 просмотров
Пригласить эксперта
Ответы на вопрос 2
@fireSparrow
В этой строке
this = self.neiron
в переменную this у вас попадает значение self.neiron
Т.к. нигде в этом цикле вы ничего не делаете с self.neiron, то на следующий итерации в новый this попадёт тот же самый объект. Т.е. фактически всё, что дальше вы добавляете в список, будет просто множеством указателей на один и тот же объект.
И каждый раз, когда вы меняете вес у объекта по одному из этих указателей, все остальные указатели будут указывать уже на этот измёненный объект. У вас не получится таким образом сделать, чтобы разные указатели указывали на разный версии одного и того-же объекта.

Выход: вот в этой строке
this = self.neiron
нужно делать копию self.neiron перед записью его в this. Тогда это будут действительно разные объекты, которыми можно манипулировать независимо.
Ответ написан
@SolidMinus
Может ответ и не по теме, но так нифига не делаются дела. Надеюсь, ты перепишешь этот ужас))

Я, конечно, когда давно интересовался нейронными сетями, но было лень читать кучу статей тоже думал, что надо создавать класс для отдельного нейрона, но, блин, какой же это бред,

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)

Забудь, пожалуйста, про ту жесть что ты написал. Без обид, сам таким был)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы