class LogisticNeuron():
def __init__(self):
self.w=None
self.b=None
def forpass(self,x):
z=np.sum(x*self.w)+self.b
return z
def backprop(self,x,err):
w_grad=x*err
b_grad=1*err
return w_grad,b_grad
def activation(self,z):
a=1/(1+np.exp(-z))
return a
def fit(self,x,y,epochs=100):
self.w=np.ones(x.shape[1])
self.b=0
for i in range(epochs):
for x_i,y_i in zip(x,y):
z=self.forpass(x_i)
a=self.activation(z)
err=-(y_i-a)
w_grad,b_grad=self.backprop(x_i,err)
self.w-=w_grad
self.b-=b_grad
def predict(self,x):
z=[self.forpass(x_i) for x_i in x]
a=self.activation(np.array(z))
return a>0.5
class TanhNeuron():
def __init__(self):
self.w=None
self.b=None
def forpass(self,x):
z=np.sum(x*self.w)+self.b
return z
def backprop(self,x,err):
w_grad=x*err
b_grad=1*err
return w_grad,b_grad
def activation(self,z):
a=(np.tanh(z)+1)/2
return a
def fit(self,x,y,epochs=100):
self.w=np.ones(x.shape[1])
self.b=0
for i in range(epochs):
for x_i,y_i in zip(x,y):
z=self.forpass(x_i)
a=self.activation(z)
err=-(y_i/a+(y_i-1)/(1-a))*(1-(np.tanh(z))**2)
w_grad,b_grad=self.backprop(x_i,err)
self.w-=w_grad
self.b-=b_grad
def predict(self,x):
z=[self.forpass(x_i) for x_i in x]
a=self.activation(np.array(z))
return a>0.5
cancer=load_breast_cancer()
x=cancer.data
y=cancer.target
x_train,x_test,y_train,y_test=train_test_split(x,y,stratify=y,test_size=0.2,random_state=42)
neuron=LogisticNeuron()
neuron.fit(x_train,y_train)
print(np.mean(neuron.predict(x_test)==y_test))
tanhneuron=TanhNeuron()
tanhneuron.fit(x_train,y_train)
print(np.mean(tanhneuron.predict(x_test)==y_test))
이렇게 class 만들어 훈련시켰는데 tanh 뉴런의 정확도가 너무 떨어져서 tanhneuron.fit 안에 있는 z를 출력하니까 계속 nan이 나와요 왜 그런건가요??
분모에 0이 가까워지는 값 포함될 수 있음 -> a or 1 - a가 0에 가까워질 때, 값이 발산할테니 nan이 될 수 있음.
이거때문에 tanh 가 nan이뜰지도