Функция стоимости в ИНС сходится к 0,5, а значения выходов сходятся к 0 - PullRequest
0 голосов
/ 13 февраля 2020

Я написал простой ИНС, чтобы лучше понять его внутреннюю структуру. Однако последние несколько дней я не мог понять, почему он не работает ожидаемым образом. То, как я определил COST FUNCTION, всегда сходится к 0,5, а мои значения OUTPUT всегда стремятся к 0.

Это простая проблема классификации Iris, но я не знаю, как ее исправить. У меня кончились идеи. Мой алгоритм мне подходит. Но я могу ошибаться. Буду очень признателен за любую помощь и предложение.

import numpy as np
import pandas as pd

df = pd.read_csv('Iris.csv')
df.columns = ['id','sl','sw','pl','pw','species']

dummy = pd.get_dummies(df['species'])
df = pd.concat([df,dummy],axis = 1)
df = df.drop(['species'],axis = 1)
df = df.drop(['id'],axis = 1)

x = df.iloc[:,0:4].values
y = df.iloc[:,[-3,-2,-1]].values

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,
                                                 test_size = 0.2,
                                                 random_state = 0)

from sklearn.preprocessing import StandardScaler
scale_x = StandardScaler()
x_train = scale_x.fit_transform(x_train)
x_test = scale_x.transform(x_test)
#__________________________________________________________________________________________

input = np.zeros(4)
hl = np.zeros(9)
output = np.zeros(3)


W = [np.random.randn(4,9)*0.01, np.random.randn(9,3)*0.01]

b = [np.zeros(9), np.zeros(3)]
l = [input, hl, output]


def sigmoid(Z):
    A = 1/(1+np.exp(-Z))

    return A

def forward_prop(l,W,b):
    for i in range(len(W)):
        print(l[i])
        print(W[i])
        l[i+1] = sigmoid(np.dot(l[i],W[i]) + b[i])
    print(l[i+1])    

def cost_f(Y, A):
    cost = 0
    for i in range(len(A)):
        cost = cost + 0.5*(Y[i] - A[i])**2

    return cost


def backward_prop(Y,l,W,b,lr):
    change = [np.zeros((4,9)),np.zeros((9,3))]
    for i in range(len(W)):
        #bias update
        for a in range(len(b[i])):
            db = 0
            if i == 1:
                db = (-Y[a]+l[i+1][a])*l[i+1][a]*(1-l[i+1][a])
                b[i][a] = b[i][a] - lr*db
            else:
                for m in range(len(l[i+2])):
                    db = db + l[i+2][m]*(1-l[i+2][m])*W[i+1][a][m]*(-Y[m]+l[i+2][m])
                db = db*l[i+1][a]*(1-l[i+1][a])
                b[i][a] = b[i][a] - lr*db

        #weights update
        for j in range(len(l[i])):
            for k in range(len(l[i+1])):
                if i == 1:
                    change[i][j][k] = l[i+1][k]*(1-l[i+1][k])*(-Y[k]+l[i+1][k])*l[i][j]

                else:
                    for n in range(len(l[i+2])):
                        change[i][j][k] = change[i][j][k] + (-Y[n]+l[i+2][n])*l[i+2][n]*(1-l[i+2][n])*W[i+1][k][n]

                    change[i][j][k] = change[i][j][k]*l[i][j]*(1-l[i+1][k])*l[i+1][k]

        W[i] = W[i]-lr*change[i]



def train(X,Y,l,W,b,lr,epochs):
    for i in range(epochs):
        for j in range(len(X)):
            ask = raw_input()
            if ask == 'y':
                l[0] = X[j]
                print(X[j])
                forward_prop(l,W,b)
                cost = cost_f(Y[j], l[2])
                print("Epoch = ",i+1, "---> cost = ",cost)
                backward_prop(Y[j],l,W,b,lr)


train(x_train, y_train, l, W, b, 0.35, 100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...