2016-07-28 4 views
4

Basierend auf dem Coursera Kurs für maschinelles Lernen, versuche ich die Kostenfunktion für ein neuronales Netzwerk in Python zu implementieren. Es gibt eine question ähnliche - mit einer akzeptierten Antwort - aber der Code in dieser Antwort ist in Oktave geschrieben. Um nicht zu faul zu sein, habe ich versucht, die relevanten Konzepte der Antwort auf meinen Fall anzupassen, und soweit ich das beurteilen kann, implementiere ich die Funktion korrekt. Die Kosten, die ich ausgegeben habe, weichen jedoch von den erwarteten Kosten ab, daher mache ich etwas falsch.Kostenfunktion des neuronalen Netzwerks implementieren (Woche 5 Coursera) mit Python

Hier ist ein kleines reproduzierbares Beispiel:

Der folgende Link führt zu einer .npz Datei, die (wie unten) geladen werden kann relevante Daten zu erhalten. Benennen Sie die Datei "arrays.npz" bitte um, wenn Sie sie verwenden.

http://www.filedropper.com/arrays_1

if __name__ == "__main__": 

with np.load("arrays.npz") as data: 

    thrLayer = data['thrLayer'] # The final layer post activation; you 
    # can derive this final layer, if verification needed, using weights below 

    thetaO = data['thetaO'] # The weight array between layers 1 and 2 
    thetaT = data['thetaT'] # The weight array between layers 2 and 3 

    Ynew = data['Ynew'] # The output array with a 1 in position i and 0s elsewhere 

    #class i is the class that the data described by X[i,:] belongs to 

    X = data['X'] #Raw data with 1s appended to the first column 
    Y = data['Y'] #One dimensional column vector; entry i contains the class of entry i 



import numpy as np 

m = len(thrLayer) 
k = thrLayer.shape[1] 
cost = 0 

for i in range(m): 
    for j in range(k): 
     cost += -Ynew[i,j]*np.log(thrLayer[i,j]) - (1 - Ynew[i,j])*np.log(1 - thrLayer[i,j]) 
print(cost) 
cost /= m 

''' 
Regularized Cost Component 
''' 

regCost = 0 

for i in range(len(thetaO)): 
    for j in range(1,len(thetaO[0])): 
     regCost += thetaO[i,j]**2 

for i in range(len(thetaT)): 
    for j in range(1,len(thetaT[0])): 
     regCost += thetaT[i,j]**2 

regCost *= lam/(2*m) 


print(cost) 
print(regCost) 

In Wirklichkeit sollte cost 0,287629 und 0,383770 cost + newCost sein sollte.

Dies ist die Kostenfunktion in der Frage oben geschrieben, als Referenz:


enter image description here

+0

Welchen Wert von Lambda verwenden Sie? Um sicherzugehen, welchen Wert erhalten Sie für die Kosten (ich bekomme ~ 10,441)? – bpachev

+0

Können Sie uns Ihre Quelle für die erwarteten Kosten geben? – bpachev

+0

Ich bin sehr zuversichtlich, dass Ihre Implementierung der Kostenfunktion korrekt ist. Ich denke, das Problem liegt in der Berechnung der Aktivierungen. – bpachev

Antwort

2

Das Problem ist, dass Sie die falsche Klasse Etiketten verwenden. Wenn Sie die Kostenfunktion berechnen, müssen Sie die Grundwahrheit oder die zutreffenden Klassenbeschriftungen verwenden.

Ich bin mir nicht sicher, was Ynew Array war, aber es war nicht die Trainingsausgaben. Also habe ich Ihren Code geändert, um Y anstelle von Ynew für die Klassenbezeichnungen zu verwenden, und die korrekten Kosten erhalten.

import numpy as np 

with np.load("arrays.npz") as data: 

    thrLayer = data['thrLayer'] # The final layer post activation; you 
    # can derive this final layer, if verification needed, using weights below 

    thetaO = data['thetaO'] # The weight array between layers 1 and 2 
    thetaT = data['thetaT'] # The weight array between layers 2 and 3 

    Ynew = data['Ynew'] # The output array with a 1 in position i and 0s elsewhere 

    #class i is the class that the data described by X[i,:] belongs to 

    X = data['X'] #Raw data with 1s appended to the first column 
    Y = data['Y'] #One dimensional column vector; entry i contains the class of entry i 


m = len(thrLayer) 
k = thrLayer.shape[1] 
cost = 0 

Y_arr = np.zeros(Ynew.shape) 
for i in xrange(m): 
    Y_arr[i,int(Y[i,0])-1] = 1 

for i in range(m): 
    for j in range(k): 
     cost += -Y_arr[i,j]*np.log(thrLayer[i,j]) - (1 - Y_arr[i,j])*np.log(1 - thrLayer[i,j]) 
cost /= m 

''' 
Regularized Cost Component 
''' 

regCost = 0 

for i in range(len(thetaO)): 
    for j in range(1,len(thetaO[0])): 
     regCost += thetaO[i,j]**2 

for i in range(len(thetaT)): 
    for j in range(1,len(thetaT[0])): 
     regCost += thetaT[i,j]**2 
lam=1 
regCost *= lam/(2.*m) 


print(cost) 
print(cost + regCost) 

Diese Ausgänge:

0.287629165161 
0.383769859091 

Edit: mit regCost *= lam/(2*m) einen ganzzahligen Teilungsfehler behoben, der die regCost wurde eliminiert.

+0

Ja, 'Ynew' unterscheidet sich definitiv von' Y_arr', und ich denke, Ihre Implementierung von 'Y_arr' ist korrekt. Das ursprüngliche 'Y'-Array hat 100' 10's, 100'1's, 100'2's und so weiter bis zu 100'9's. Ich habe die '10' auf den Index 0 basierend auf diesem Kommentar aus Kapitel 4, der den gleichen Datensatz verwendet, abgebildet:" Beachten Sie, dass das y Argument für diese Funktion ein Vektor von Beschriftungen von 1 bis 10 ist Stellen Sie sicher, dass dies nichts anderes bedeutet als das, was ich dachte. – Muno

+0

Dann ist die einzige Unsicherheit, warum '0,0 'die regulierten Kosten anstelle von ~ ist 0.38-0.28 – Muno

+0

Sie hatten ganzzahlige Division mit regCost * = lam/(2 * m) und multipliziert mit 0. Ich habe es behoben und bekam die richtige regCost. – bpachev

Verwandte Themen