Я написал простой ИНС, чтобы лучше понять его внутреннюю структуру. Однако последние несколько дней я не мог понять, почему он не работает ожидаемым образом. То, как я определил 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)