神经网络从头开始使用一个隐藏层和sigmoid激活

时间:2017-06-28 16:29:35

标签: python numpy machine-learning neural-network

我正在从练习中创建一个神经网络,我不是很有经验的python程序员。 我知道神经网络的大部分数学概念。我的模型表现不佳.Sigmoid函数的驱动是h(x)*(1-h(x))但我不确定代码行是否正确,我在google上搜索它并且每个人都使用了tanh激活。而且我不确定delta 2.i不知道我的代码出错了。我对如何减去预测(y)-label(y)几乎没有疑问。这是一个三级分类器。

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

这行代码对我来说也不清楚,我已经从网上复制了它只是把我的m1(其中的例子总数)。因为我的y矩阵(标签形式为0,1,2)是一个顺序向量(150,1)和预测矩阵是(151,21)sp我们如何减去它们。

#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))
y=np.array(df['Species'])



m1=np.size(y)

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,2):
    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

    print(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=-np.log(probs[range(m1),y])
    data_loss=np.sum(correct_logprobs)
    data_loss+=lamda/2*(np.sum(np.square(theta))+ np.square(theta2))
    ( 1./m1*data_loss)

我对theta(权重)的输出是

[[ 1.22833047]
 [ 1.22591229]
 [ 1.22341726]
 [ 1.22162091]]

显然不能正确。

0 个答案:

没有答案