Стоимость нейронной сети не ниже определенного значения - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь реализовать нейронную сеть в python для правильной классификации цифр. ниже мой код. стоимость начиналась с 16000, затем снизилась до 1600, а затем уже не может быть go ниже.

никаких намеков на то, как я могу улучшить свою нейронную сеть.

я без предвзятости, и моя скорость обучения составляет 0,01.

    from sklearn.datasets import load_digits
    digits=load_digits()
    X=digits.data
    y=digits.target

    #dgt_otpt is a 10x10 identity matrix 
    #dgt_otpt[0] output for the value 0
    #dgt_otpt[1] output for the value 1
    #dgt_otpt[2] output for the value 2
    #..
    #..
    #..
    #dgt_otpt[9] output for the value 9

    dgt_otpt=np.eye(10)

    #2 layer network 
    sizes=[len(X[0]),25,10]

    #weights
    weights=[np.random.rand(y,x) for x,y in zip(sizes[:-1],sizes[1:])]

    #sigmoid function
    def sg_fnc(z):
        return 1.0/(1.0+np.exp(-z))

    #sigmoid derivative function
    def sg_fnc_drvtv(z):
        return sg_fnc(z)*(1-sg_fnc(z))

    n=0
    while n<10000:

        #calculating the cost of the network
        cst=0
        for i in zip (X,y):
            z1=np.dot(weights[0],i[0].reshape(64,1))
            hddn_lyr=sg_fnc(z1)

            z2=np.dot(weights[1],hddn_lyr)
            otpt_lyr=sg_fnc(z2)

            m=dgt_otpt[i[1]]
            m=m.reshape(10,1)

            cst+=np.sum((otpt_lyr-m)**2)

        print("interation:",n)
        print("cost:",cst)



        for i in zip (X,y):

            #feed forward
            z1=np.dot(weights[0],i[0].reshape(64,1))
            hddn_lyr=sg_fnc(z1)

            z2=np.dot(weights[1],hddn_lyr)
            otpt_lyr=sg_fnc(z2)

            m=dgt_otpt[i[1]]
            m=m.reshape(10,1)

            #backpropogation
            grd_dscnt_1=np.dot(2*(otpt_lyr-m)*sg_fnc_drvtv(z2),hddn_lyr.T)
            grd_dscnt_2=np.dot((np.dot(weights[1].T,2*(otpt_lyr-m)*sg_fnc_drvtv(z2))*sg_fnc_drvtv(z1)),i[0].reshape(1,64))

            weights[1]-=0.01*grd_dscnt_1
            weights[0]-=0.01*grd_dscnt_2

        n+=1

1 Ответ

0 голосов
/ 01 августа 2020

Спасибо, Maleeha за предложение стандартизации данных. у меня стоимость снизилась до 3. что-то

ниже весь мой код

from sklearn.datasets import load_digits
digits=load_digits()
X=digits.data
y=digits.target
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
digit_scale=StandardScaler()
digit_data=digit_scale.fit_transform(X)
X=digit_data

#dgt_otpt is a 10x10 identity matrix 
#dgt_otpt[0] output for the value 0
#dgt_otpt[1] output for the value 1
#dgt_otpt[2] output for the value 2
#..
#..
#..
#dgt_otpt[9] output for the value 9

dgt_otpt=np.eye(10)

#2 layer network 
sizes=[len(X[0]),25,10]

#weights
weights=[np.random.rand(y,x) for x,y in zip(sizes[:-1],sizes[1:])]

#sigmoid function
def sg_fnc(z):
    return 1.0/(1.0+np.exp(-z))

#sigmoid derivative function
def sg_fnc_drvtv(z):
    return sg_fnc(z)*(1-sg_fnc(z))

n=0
while n<10000:

    #calculating the cost of the network
    cst=0
    for i in zip (X,y):
        z1=np.dot(weights[0],i[0].reshape(64,1))
        hddn_lyr=sg_fnc(z1)

        z2=np.dot(weights[1],hddn_lyr)
        otpt_lyr=sg_fnc(z2)

        m=dgt_otpt[i[1]]
        m=m.reshape(10,1)

        cst+=np.sum((otpt_lyr-m)**2)

    print("interation:",n)
    print("cost:",cst)



    for i in zip (X,y):

        #feed forward
        z1=np.dot(weights[0],i[0].reshape(64,1))
        hddn_lyr=sg_fnc(z1)

        z2=np.dot(weights[1],hddn_lyr)
        otpt_lyr=sg_fnc(z2)

        m=dgt_otpt[i[1]]
        m=m.reshape(10,1)

        #backpropogation
        grd_dscnt_1=np.dot(2*(otpt_lyr-m)*sg_fnc_drvtv(z2),hddn_lyr.T)
        grd_dscnt_2=np.dot((np.dot(weights[1].T,2*(otpt_lyr-m)*sg_fnc_drvtv(z2))*sg_fnc_drvtv(z1)),i[0].reshape(1,64))

        weights[1]-=0.01*grd_dscnt_1
        weights[0]-=0.01*grd_dscnt_2

    n+=1
...