A neurális hálózatoknak tipikusan több mint egy rétegük van. Ezek a rétegek nem mások mint neuron csoportok. Minden egyes azonos rétegen lévő neuron ugyanazokat a bemeneti paramétereket kapja meg, majd a súlyok és ‘bias’ segítségével egyedi kimenetet hoz létre. Egy réteg kimenete egy készlet ezekből a kimenetekből.
A példába 4 bementi értékünk lesz de többfajta súlyunk és ‘bias’-unk.
inputs = [1, 2, 3 , 2.5]
weights1 = [0.2, 0.8, -0.5, 1]
weights2 = [0.5, -0.91, 0.26, -0.5]
weights3 = [-0.26, -0.27, 0.17, 0.87]
bias1 = 1
bias2 = 3
bias3 = 0.5
outputs = [
# Neuron 1:
inputs[0]*weights1[0] +
inputs[1]*weights1[1] +
inputs[2]*weights1[2] +
inputs[3]*weights1[3] + bias1,
# Neuron 2:
inputs[0]*weights2[0] +
inputs[1]*weights2[1] +
inputs[2]*weights2[2] +
inputs[3]*weights2[3] + bias2,
# Neuron 3
inputs[0]*weights3[0] +
inputs[1]*weights3[1] +
inputs[2]*weights3[2] +
inputs[3]*weights3[3] + bias3]
print(outputs)
Ebben az esetben 3 készletni súlyunk és ‘bias’-unk van, ami 3 neuron határoz meg. Minden neuron a ugyanahoz a bemeneti értékhez “kapcsodik”, csak mindengyiknke különböző a paramétere. Amikor minden neuronnak az adott rétegből kapcsolata van az előző réteg minden neuronjával azt “fully connected“-nek nevezzük. Mivel ezt is fáradtságos volt leírni, pedig csak 3 neuront hoztunk létre így ha többte akarnánk létrehozni célszerű lesz, úgynevezett ‘loop’-okat létrehozni. A következőekben a súlyokat egy nagy listába teszsük így mivel így keresztül tudunk menni rajtuk.
inputs = [1, 2, 3 , 2.5]
weights = [[0.2, 0.8, -0.5, 1], [0.5, -0.91, 0.26, -0.5], [-0.26, -0.27, 0.17, 0.87]]
biases = [2, 3, 0.5]
#adott layer kimenete
layer_outputs = []
#Hogy minden neuront megkapjunk ezért 'for' ciklust/loop-ot hazsnálunk.
for neuron_weights, neuron_bias in zip(weights, biases):
#lenullázzuk az adott neuron kimenetelét
neuron_output = 0
#minden bemenet és súlya a neutronnak
for n_input, weight in zip(inputs, neuron_weights):
#Megszorozzuk a bemenetet a hozzákapcsolt súllyal.
#és utána hozzáadjuk a neuron_output változóhoz
neuron_output += n_input-weight
#hozzáadjuk a 'bias'-t
neuron_output += neuron_bias
#Ezt pedig beletesszük a llayer_outputs listába
layer_outputs.append(neuron_output)
print(layer_outputs)
Amit nem értettem én sem, hogy mi a zip(). Az anniyt segít, hogy keresztül tudjunk menni egyszerr több listán is. Vagyis itt azt kell elképzelni, hogy az első for ciklusba bekerül a weights és a biases. Először ugye mindkettőből a nulladik indexű tag. A weights esetében ez ugye egy lista. Ezután a következő for ciklusban pedig az inputok és a változóként létrehozott weights kerül bele. Következő lépésben végigmegyünk az input lista elemein és a weights lista első elemén is(ami egy lista, így azon is végig tudunk menni). Az azonos indexen szereplő értékeke összeszorozza majd, hozzáadja a ‘bias’-t és ez lesz az első értékünk a layer_outputs-ban.
Az angol nyelvű videó itt található meg.
Disclaimer: A videó és a leírtak nem a saját szerzeményeim. A videó a Sentdex youtube csatornáé, az oldal tartalma pedig a “Neural Networks from Scratch in Python” című könyv alapján készült.
Az előzőekben bemutattam, hogyan is kell egy neuron felépíteni.