私は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))
正直言って、私はpython.i undestandでそれほど悪くないです。これらのことはすべて知っています。しかし、私はこの行の意味を理解していません。 "delta3 [range(m1 )、y] - = 1 "私の目標は損失のためにyy(予測)を減算する必要がありますが、どちらも次元が異なり、誰でもこの方法を使用しています。 – anku
私は個人的には、これらの問題をすべて解決するためにテンソルフローを使用することをお勧めしますが、同じサイズになるまで小さいリストに値を追加するだけです。値を0にしないでください。これは、モデルによって少し相殺されるため、代わりに両方のモデルの平均値を使用します。 –
私はテンソルの流れでたくさんのプロジェクトを行ってきましたが、私はコアコンセプトをよく理解していないことに気付きました。それはなぜ試みているのかです。 – anku