python中使用sigmoid激活的从头开始的神经网络

python中使用sigmoid激活的从头开始的神经网络,python,numpy,neural-network,kaggle,iris-recognition,Python,Numpy,Neural Network,Kaggle,Iris Recognition,我是python新手,尝试用python学习机器学习。我尝试从头开始编写一个神经网络,在著名的iris数据集上有一个隐藏层。这是一个三类分类器,输出作为一个热向量。我还从已经编写的算法中获取帮助。例如,我使用了与测试集相同的训练集 这是一个巨大的代码,我想让你告诉我,我们如何减去维度(150,3)的“y”输出(这是一个热向量),我的输出y softmax将是向量(150,21)。这是我最大的问题。我试图在网上查找每个人都使用过这种方法,但由于我在python方面很弱,我不理解它。这是代码行del

我是python新手,尝试用python学习机器学习。我尝试从头开始编写一个神经网络,在著名的iris数据集上有一个隐藏层。这是一个三类分类器,输出作为一个热向量。我还从已经编写的算法中获取帮助。例如,我使用了与测试集相同的训练集

这是一个巨大的代码,我想让你告诉我,我们如何减去维度(150,3)的“y”输出(这是一个热向量),我的输出y softmax将是向量(150,21)。这是我最大的问题。我试图在网上查找每个人都使用过这种方法,但由于我在python方面很弱,我不理解它。这是代码行
delta3[range(m1),y]-=1
用作索引的数组必须是整数(或布尔)类型
如果m1是(150)的sie 如果我给出大小m1(150,3),那么
delta3[范围(m1),y]=1
TypeError:应为range()整数结束参数,获得元组。

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中,
range
使用
range(x,y)
生成一个从x到y的数字元组。如果生成类似于
范围(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中的列表数据结构。以及


我想你想要的是这样的:
delta3=[[z-1代表delta3中的z[x:y]]代表范围(m1)中的x]
。此列表理解使用两代,一代是从列表中的每个元素中减去一的
[x-1代表l中的x]
,另一代是从范围(m)中的x中减去一的
[l[x:y]
,生成一个列表,列表中的值从x到y的范围为m。尽管我不确定自己是否完全理解您的最终目标。

老实说,我对python的理解并不是那么差。我对列表非常了解。我知道所有这些事情。但我不理解这行的含义。在我的代码“delta3[range(m1),y]=1”中,我的目标应该是减去y-y(预测)以弥补损失,但是这两种方法都是不同维度的,这是怎么可能的,每个人都在使用这种方法,而且为什么每次迭代都要减去“1”。我个人更喜欢使用tensorflow,因为它可以为我解决所有这些问题,但你要做的是向较小的列表添加值,直到其大小相同。不要将值设为0,因为这会使您的模型偏移一点,而是使用两个模型的平均值。我在tensor flow中做过很多项目,但我意识到我对核心概念没有很好的理解。这就是为什么is正在尝试。感谢您的建议,我会这样做。