Eigene Implementierung eines Neuronales Netzwerkes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@fail: die for-Schleife in Zeile 28/29 macht doch gar keinen Sinn: weights wird dort gar nicht verwendet.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Es sind immer diese Flüchtigeitsfehler :lol: . Hab's korrigiert, funktioniert jetzt. Vielen Dank.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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: )
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Wieso antwortet niemand? Kennt niemand eine Lösung oder habe ich es schlecht beschrieben oder hat niemand Lust sich den Code anzuschauen....?
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.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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
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.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@fail: wenn es Dir nur im die Dimensionen geht:

Code: Alles auswählen

new_weights = new_weights.reshape(1,-1)
Antworten