2017-06-29 3 views
2

Ich bin neu in Python und versuchte Maschine in python.i Lernen zu lernen hat versucht, ein neuronales Netzwerk von Grunde auf mit einer verborgenen Schicht auf der berühmten Iris dataset.this zu schreiben, ist ein drei class classifier mit out put als eine hot vectors.i habe auch hilfe von bereits geschriebenen algos für hilfe genommen. zum beispiel habe ich das gleiche trainingsset wie mein testset benutzt.neuronales Netzwerk von Grunde auf neu in Python mit Sigmoid Aktivierung

es ist ein riesiger Code zu durchlaufen, ich möchte, dass Sie mir sagen, dass wie wir 'y' Ausgabe (die ein heißer Vektor ist) der Dimensionen (150,3) subtrahieren und mein out y softmax wird sein von Vektor (150,21) .Dies ist mein größter problem.i Online jeder suchen versucht, diese Methode verwendet haben, aber da ich in python schwach bin nicht verstehe ich it.This die Codezeile ist delta3[range(m1), y] -= 1 arrays used as indices must be of integer (or boolean) type wenn m1 ist sie von (150) und wenn i Größe m1 (150,3) geben dann delta3[range(m1), y] -= 1 TypeError: range() integer end argument expected, got tuple.

remember m1=150 
my y vector=150,3 
softmax=150,21 

mein Code

#labels or classes 
#1=iris-setosa 
#2=iris-versicolor 
#0=iris-virginica 

#features 
#sepallength 
#sepalwidth 
#petallengthcm 
#petalwidth 


import pandas as pd 
import matplotlib.pyplot as plt 
import csv 
import numpy as np 
df=pd.read_csv('Iris.csv') 

df.convert_objects(convert_numeric=True) 
df.fillna(0,inplace=True) 

df.drop(['Id'],1,inplace=True) 
#function to convert three labels into values 0,1,2 
def handle_non_numericaldata(df): 
    columns=df.columns.values 
    for column in columns: 
     text_digit_vals={} 
     def convert_to_int(val): 
      return text_digit_vals[val] 
     if df[column].dtype!=np.int64 and df[column].dtype!=np.float:  
      column_contents=df[column].values.tolist() 
      unique_elements=set(column_contents) 
      x=0 
      for unique in unique_elements: 
       if unique not in text_digit_vals: 
        text_digit_vals[unique]=x 
        x+=1 
      df[column]=list(map(convert_to_int,df[column])) 
    return(df) 
handle_non_numericaldata(df)  

x=np.array(df.drop(['Species'],1).astype(float)) 
c=np.array(df['Species']) 


n_values=(np.max(c)+1) 
y=(np.eye(n_values)[c]) 

m1=np.size(c) 

theta=np.ones(shape=(4,1)) 
theta2=np.ones(shape=(1,21)) 
#no of examples "m" 

#learning rate alpha 
alpha=0.01 
#regularization parameter 
lamda=0.01 
for i in range(1,1000): 
    z1=np.dot(x,theta) 
    sigma=1/(1+np.exp(-z1)) 

    #activation layer 2. 
    a2=sigma 
    z2=np.dot(a2,theta2) 

    probs=np.exp(z2) 

    softmax=probs/np.sum(probs,axis=1,keepdims=True) 
    delta3=softmax 



    delta3[range(m1), y] -= 1 

    A2=np.transpose(a2) 
    dw2 = (A2).dot(delta3) 
    W2=np.transpose(theta2) 

    delta2=delta3.dot(W2)*sigma*(1-sigma) 
    X2=np.transpose(x) 
    dw1=np.dot(X2,delta2) 


    dw2=dw2-lamda*theta2 
    dw1=dw1-lamda*theta 

    theta =theta -alpha* dw1 

    theta2= theta2-alpha * dw2 
    correct_logprobs=0 
    correct_logprobs=correct_logprobs-np.log(probs[range(m1),y]) 
    data_loss=np.sum(correct_logprobs) 
    data_loss+=lamda/2*(np.sum(np.square(theta))+ np.square(theta2)) 
    loss=1./m1*data_loss 
    if 1000%i==0: 
     print("loss after iteration%i:%f",loss) 


final1=x.dot(theta) 
sigma=1/(1+np.exp(-final1)) 
z2=sigma.dot(theta2) 
exp_scores=np.exp(z2) 
probs=exp_scores/np.sum(exp_scores,axis=1,keepdims=True) 
print(np.argmax(probs,axis=1)) 

Antwort

0

In Python range generiert ein Tupel von Zahlen von x bis y mit range(x, y). Wenn Sie etwas wie range(10) erzeugen, dann ist es dasselbe wie (0, 1, 2, 3, 4, 5, 6, 7, 8, 9). Listen in Python benötigen einen ganzzahligen Index wie list[0] oder list[4], nicht list[0, 4], jedoch gibt es eine eingebaute Sache in Python, die den Zugriff von Index x zu Index y in einer Liste erlaubt hier ist die Syntax: list[0:4]. Dies gibt jeden Wert von 0 bis 3 in der Liste zurück. Wenn beispielsweise eine Liste list = [0,10,3,4,12,5,3] lautet, wird list[0:4][0,10,3,4] zurückgeben.

Versuchen Sie einen Blick auf die Liste Datenstrukturen in Python on the Python Docs nehmen. Sowie Understanding Generators in Python.

denke ich, was Sie suchen so etwas wie dieses: delta3 = [[z-1 for z in delta3[x:y]] for x in range(m1)]. Diese Liste Verständnis verwendet zwei Generationen beide [x-1 for x in l], die man von jedem Element in der Liste subtrahiert, und [l[x:y] for x in range(m)], die eine Liste von Listen mit Werten durch x zu y in einem Bereich von m erzeugt. Obwohl ich nicht sicher bin, verstehe ich, was dein Endziel ist, vollständig.

+0

um ehrlich zu sein, ich bin nicht so schlecht in python.i undestand ziemlich well.i Listen über all diese Dinge wissen .but ich die Bedeutung dieses nicht line.in meinen Code verstehen, die „delta3 [Bereich (m1), y] - = 1 "Mein Ziel sollte sein, yy (Vorhersage) für Verlust zu subtrahieren, aber beide sind von unterschiedlicher Dimension, wie ist das möglich und jeder benutzt diese Methode außerdem, warum '1' bei jeder Iteration subtrahiert wird. – anku

+0

Ich persönlich bevorzuge die Verwendung von Tensorflow, weil es all diese Probleme für mich lösen wird, aber was Sie tun möchten, ist, Werte zu der Liste hinzuzufügen, die kleiner ist, bis sie die gleiche Größe hat. Machen Sie die Werte nicht 0, da dies Ihr Modell ein wenig ausgleicht, stattdessen verwenden Sie einen gemittelten Wert beider Modelle. –

+0

Ich habe viele Projekte im Tensor Flow gemacht, aber ich habe festgestellt, dass ich kein gutes Verständnis der Kernkonzepte habe. Deshalb habe ich versucht. Danke für den Rat, ich werde es tun. – anku