Seite 1 von 1

Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Freitag 11. April 2014, 19:48
von fail
Ich hab ein Problem mit meiner Implementierung eines Neuronales Netzwerkes. Nämlich mit den Dimensionen der Numpy-Arrays in der backpropagate() Funktion

Hier: http://pastebin.com/g4wvmSis

Der Output ist:
[array([3, 4, 5]), array([[12, 24, 36],
[12, 24, 36],
[12, 24, 36]]), array([[[ 72, 144, 216],
[ 72, 144, 216],
[ 72, 144, 216]],

[[ 72, 144, 216],
[ 72, 144, 216],
[ 72, 144, 216]],

[[ 72, 144, 216],
[ 72, 144, 216],
[ 72, 144, 216]]]), array([[[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]],

[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]],

[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]]],


[[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]],

[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]],

[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]]],


[[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]],

[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]],

[[ 432, 864, 1296],
[ 432, 864, 1296],
[ 432, 864, 1296]]]])]


Dabei sollte er einfach array([3,4,5]),array([72,144,216]),array([432,864,1296]) sein.

Danke

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Freitag 11. April 2014, 21:45
von Sirius3
@fail: die for-Schleife in Zeile 28/29 macht doch gar keinen Sinn: weights wird dort gar nicht verwendet.

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Freitag 11. April 2014, 22:03
von fail
Es sind immer diese Flüchtigeitsfehler :lol: . Hab's korrigiert, funktioniert jetzt. Vielen Dank.

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Sonntag 13. April 2014, 10:25
von fail
Ich hab wieder ein Problem :?

http://pastebin.com/g4wvmSis

In der Backpropagate Funktion.

[array([[ 0.11910611, 0.70402028],
[ 0.83047441, 0.55448528]]), array([[ 0.19644666, 0.62811239]])]
[array([[ 0.11910611, 0.70402028],
[ 0.83047441, 0.55448528]]), array([ 0.19644666, 0.62811239])]

Der erste Output ist mit von mir gesetzten Gewichten. Der zweite mit den von Backpropagate berechneten. Die Dimensionen stimmen nicht überein. Ich weiss nicht was tun, allenfalls muss ich das mit Indexes lösen ( :cry: )

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Sonntag 13. April 2014, 19:13
von fail
Vielleicht hab ich mich falsch ausgedrückt. Der Output von backpropagate sollte z.B. so sein:

Code: Alles auswählen

[array([[1,2,3,4],[5,6,7,8]]), array([[9,10,11,12]])]
Aber ist so:

Code: Alles auswählen

[array([[1,2,3,4],[5,6,7,8]]), array([9,10,11,12])]
Das heisst das zweite Array ist 1-Dimensional sollte aber 2-Dimensional sein. Was mach ich falsch?

Danke

fail

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Dienstag 15. April 2014, 15:00
von fail
Wieso antwortet niemand? Kennt niemand eine Lösung oder habe ich es schlecht beschrieben oder hat niemand Lust sich den Code anzuschauen....?

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Dienstag 15. April 2014, 15:09
von BlackJack
@fail: Das ist wahrscheinlich erst einmal fleissarbeit die Stelle zu finden ab der das Ergebnis nicht mehr dem erwarteten Format entspricht. Kannst Du den Programmablauf nicht selbst durchgehen und das Problem eingrenzen? Irgendwo muss doch ein Punkt sein, wo die Eingangswerte/Operanden noch so aussehen wie erwartet, das Ergebnis aber nicht mehr.

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Dienstag 15. April 2014, 19:28
von fail
Minimal Beispiel (kein Fehler in layer, nur zur Ausführung des Programms mitgeliefert):

Code: Alles auswählen

import numpy as np
def layer(inputs, weights, bias):
    """Calculates the values of the next layer"""
    #adds one as bias to the inputs
    inputs = np.vstack([inputs, [1]]) if bias else inputs
    return np.tanh(np.dot(weights, inputs))
    

def backpropagate(speed, all_weights, all_errors, inputs, bias):
	new_all_weights = []
	outputs = inputs
	for weights, errors in zip(all_weights, all_errors):
		outputs = layer(outputs, weights, bias)
		new_weights = np.array([[]])
		for index,error in enumerate(errors):
			new_row = np.array([])
			row = weights[index:index+1]
			for weight in row:
				new_row = np.append(new_row,
							weight+speed*error*inputs[index]*outputs[index])
			new_weights = np.append(new_weights,new_row) if np.array_equal(new_weights,np.array([[]])) else np.vstack((new_weights,new_row))
		new_all_weights.append(new_weights)
	return new_all_weights
 
weights = [np.random.rand(1,2)]  # wenn man z.B. [np.random.rand(2,2)] benutzt gibt es 2-Dimensionale array bei der backpropagate funktion, so wie es sein sollte
inputs = np.array([[1],[2]])
ideal_outputs = np.array([3])
outputs = np.array([[2]])
errors = [np.array([0.19211773, 0.59422259]), np.array([0.72759546])]
weights = backpropagate(0.1,weights, errors, inputs, False)
print weights
Der Fehler ist bei new_weights in der Backpropagatefunktion.
Ich hoffe ihr könnt mir helfen.

Danke im Vorraus

fail

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Dienstag 15. April 2014, 19:51
von BlackJack
Hm:

Code: Alles auswählen

$ python forum5.py
Traceback (most recent call last):
  File "forum5.py", line 30, in <module>
    weights = backpropagate(0.1,weights, errors, inputs, False)
  File "forum5.py", line 21, in backpropagate
    new_weights = np.append(new_weights,new_row) if np.array_equal(new_weights,np.array([[]])) else np.vstack((new_weights,new_row))
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/shape_base.py", line 226, in vstack
    return _nx.concatenate(map(atleast_2d,tup),0)
ValueError: all the input array dimensions except for the concatenation axis must match exactly
`ideal_ouputs` und `outputs` werden nirgends verwendet.

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Dienstag 15. April 2014, 20:16
von fail
Ouh, sorry hier:

Code: Alles auswählen

import numpy as np
def layer(inputs, weights, bias):
    """Calculates the values of the next layer"""
    #adds one as bias to the inputs
    inputs = np.vstack([inputs, [1]]) if bias else inputs
    return np.tanh(np.dot(weights, inputs))
   
 
def backpropagate(speed, all_weights, all_errors, inputs, bias):
        new_all_weights = []
        outputs = inputs
        for weights, errors in zip(all_weights, all_errors):
                outputs = layer(outputs, weights, bias)
                new_weights = np.array([[]])
                for index,error in enumerate(errors):
                        new_row = np.array([])
                        row = weights[index:index+1]
                        for weight in row:
                                new_row = np.append(new_row,
                                                        weight+speed*error*inputs[index]*outputs[index])
                        new_weights = np.append(new_weights,new_row) if np.array_equal(new_weights,np.array([[]])) else np.vstack((new_weights,new_row))
                new_all_weights.append(new_weights)
        return new_all_weights
 
weights = [np.random.rand(2,2),np.random.rand(1,2)]
inputs = np.array([[np.random.randint(0,2)],
                   [np.random.randint(0,2)]])
errors = [np.array([0.19211773, 0.59422259]), np.array([0.72759546])]
weights = backpropagate(0.1,weights, errors, inputs, False)
print weights
Der Output ist :

Code: Alles auswählen

[array([[0.97032528, 0.23542415], [0.27283704, 0.27943038]]), array([0.93738831, 0.75348964])]
Das zweite Array sollte 2-Dimensional sein, zur Weiterverarbeitung im Programm


fail

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Mittwoch 16. April 2014, 16:44
von fail
Habe es jetzt unschön mit:

Code: Alles auswählen

new_weights = np.array([new_weights]) if len(new_weights.shape) == 1 else new_weights
nach der Schleife gelöst
Wenn es nichts eleganteres gibt.
Trotzdem danke.

fail

Re: Eigene Implementierung eines Neuronales Netzwerkes

Verfasst: Mittwoch 16. April 2014, 18:47
von Sirius3
@fail: wenn es Dir nur im die Dimensionen geht:

Code: Alles auswählen

new_weights = new_weights.reshape(1,-1)