2017-06-29 83 views
2

我是新来的python,试图学习机器学习在python.i试图从头开始写一个神经网络与着名的虹膜数据集上的一个隐藏层。这是一个三一个分类器与输出作为一个热矢量。我也从已经写好的算法中获得帮助,例如我使用了与我的测试集相同的训练集。神经网络从零开始在python中使用sigmoid激活

这是一个庞大的代码,我希望你告诉我,我们如何减去尺寸(150,3)的'y'输出(这是一个热点矢量),我的输出y softmax是矢量(150,21)。这是我最大的问题。我试图在网上看到每个人都使用这种方法,但因为我在python弱我不明白it.this是行代码delta3[range(m1), y] -= 1 arrays used as indices must be of integer (or boolean) type如果m1是SIE的(150) 和,如果我给尺寸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

在Python中rangerange(x, y)生成一个从x到y的数字元组。如果您生成类似range(10)的东西,则它与(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)相同。 Python中的列表需要一个整数索引,如list[0]list[4],而不是list[0, 4],但是,Python中有一个内置的功能,允许从索引x访问列表中的索引y,这里的语法是: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)]。这个列表解析使用两代两者[x-1 for x in l],其中减去一个从列表中的每个元素,并且[l[x:y] for x in range(m)],它通过X生成列表的与值的列表到y的范围内的米。虽然我不确定我完全理解你的最终目标是什么。

+0

说实话我不是python.i坏名单已了解相当well.i知道所有这些事情。但我不明白这个line.in我的代码的含义是“delta3 [范围(M1 ),Y] - = 1" 我的目标应该减去损失YY(预测),但两者是不同的尺寸怎么可能,每个人都被而且使用这种方法为什么是‘1’每次迭代中减去。 – anku

+0

我个人更喜欢使用张量流,因为它会为我解决所有这些问题,但是您想要做的是将值添加到较小的列表中,直到尺寸相同为止。不要使值为0,因为这会使您的模型偏移一点,而是使用两个模型的平均值。 –

+0

我已经做了很多的张量流的项目,但我已经意识到我没有核心concepts.that的很好理解,为什么是你的建议trying.thanks,我会做到这一点。 – anku