2017-06-29 3 views
2

私はpython.iで機械学習を学ぼうとしているが、有名なアイリスデータセットに1つの隠れた層でニューラルネットワークを書き込もうとしました。私はテストセットと同じトレーニングセットを使用していました。ニューラルネットワークをゼロからシグモイドアクティベーションを使用してPythonで

これは巨大なコードですが、私はあなたに私たちに、次元(150,3)の「y」出力を引いてベクトル(150,21)の。これは私の最大の問題です。私は誰もがこのメソッドを使用しているが、私はそれが理解していないPythonで弱いので、このメソッドを使用してオンラインで見てみました。 arrays used as indices must be of integer (or boolean) type if m1 (150) のSIEがあると私はその後、サイズM1(150,3)を得た場合 delta3[range(m1), y] -= 1 TypeError: range() integer end argument expected, got tuple.

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

私のコードは

です
#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)) 

答えて

0

rangeは、xからyまでのタプルをrange(x, y)で生成します。 range(10)のようなものを生成する場合は(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)と同じです。 Pythonのリストには、list[0]list[4]などの整数インデックスが必要ですが、list[0, 4]ではなく、リスト内のインデックスxからインデックスyへのアクセスを許可するPythonの組み込み関数があります。list[0:4]です。これにより、リストの0から3までのすべての値が返されます。例えば、リストがlist = [0,10,3,4,12,5,3]の場合、list[0:4][0,10,3,4]を返します。

Python on the Python Docsのリストデータ構造を見てみてください。同様にUnderstanding Generators in Python

あなたの探しているものは、次のようなものだと思います。delta3 = [[z-1 for z in delta3[x:y]] for x in range(m1)]。このリストの理解度は、リスト内のすべての要素から1つを減算する[x-1 for x in l]と、mの範囲でxからyまでの値を持つリストのリストを生成する[l[x:y] for x in range(m)]の2つの世代を使用します。私はあなたの最終目標が何であるかを完全に理解していませんが、完全に理解しています。

+0

正直言って、私はpython.i undestandでそれほど悪くないです。これらのことはすべて知っています。しかし、私はこの行の意味を理解していません。 "delta3 [range(m1 )、y] - = 1 "私の目標は損失のためにyy(予測)を減算する必要がありますが、どちらも次元が異なり、誰でもこの方法を使用しています。 – anku

+0

私は個人的には、これらの問題をすべて解決するためにテンソルフローを使用することをお勧めしますが、同じサイズになるまで小さいリストに値を追加するだけです。値を0にしないでください。これは、モデルによって少し相殺されるため、代わりに両方のモデルの平均値を使用します。 –

+0

私はテンソルの流れでたくさんのプロジェクトを行ってきましたが、私はコアコンセプトをよく理解していないことに気付きました。それはなぜ試みているのかです。 – anku

関連する問題