홍채 데이터 세트의 회귀를 수행하여 유형을 예측합니다. 나는 동일한 데이터와 동일한 신경망을 사용하여 성공적으로 분류를 수행했다. 분류를 위해 모든 레이어에서 tanh를 활성화 함수로 사용했습니다. 그러나 회귀 분석을 위해, 나는 숨겨진 레이어에서 tanh 함수를 사용하고 출력 레이어에서 ID 함수를 사용합니다.신경망의 선형 함수는 출력으로 큰 값을 생성합니다.
import numpy as np
class BackPropagation:
weight =[]
output =[]
layers =0
eta = 0.1
def __init__(self, x):
self.layers = len(x)
for i in range(self.layers-2):
w = np.random.randn(x[i]+1,x[i+1]+1)
self.weight.append(w)
w = w = np.random.randn(x[-2]+1,x[-1])
self.weight.append(w)
def tanh(self,x):
return np.tanh(x)
def deriv_tanh(self,x):
return 1.0-(x**2)
def linear(self,x):
return x
def deriv_linear(self,x):
return 1
def training(self,in_data,target,epoch=100):
bias = np.atleast_2d(np.ones(in_data.shape[0])*(-1)).T
in_data = np.hstack((in_data,bias))
print("Training Starts ......")
while epoch!=0:
epoch-=1
self.output=[]
self.output.append(in_data)
# FORWARD PHASE
for j in range(self.layers-2):
y_in = np.dot(self.output[j],self.weight[j])
y_out = self.tanh(y_in)
self.output.append(y_out)
y_in = np.dot(self.output[-1],self.weight[-1])
y_out = self.linear(y_in)
self.output.append(y_out)
print("Weight Is")
for i in self.weight:
print(i)
# BACKWARD PHASE
error = self.output[-1]-target
print("ERROR IS")
print(np.mean(0.5*error*error))
delta=[]
delta_o = error * self.deriv_linear(self.output[-1])
delta.append(delta_o)
for k in reversed(range(self.layers-2)):
delta_h = np.dot(delta[-1],self.weight[k+1].T) * self.deriv_tanh(self.output[k+1])
delta.append(delta_h)
delta.reverse()
# WEIGHT UPDATE
for i in range(self.layers-1):
self.weight[i] -= (self.eta * np.dot(self.output[i].T, delta[i]))
print("Training complete !")
print("ACCURACY IS")
acc = (1.0-(0.5*error*error))*100
print(np.mean(acc))
def recall(self,in_data):
in_data = np.atleast_2d(in_data)
bias = np.atleast_2d(np.ones(in_data.shape[0])*(-1)).T
in_data = np.hstack((in_data,bias))
y_out = in_data.copy()
for i in range(self.layers-2):
y_in = np.dot(y_out,self.weight[i])
y_out = self.tanh(y_in).copy()
y_in = np.dot(y_out,self.weight[-1])
y_out = self.linear(y_in).copy()
return y_out
# MAIN
data = np.loadtxt("iris.txt",delimiter=",")
obj = BackPropagation([4,2,1])
in_data = data[:rows,:cols].copy()
target = data[:rows,cols:].copy()
obj.training(in_data,target)
print("ANSWER IS")
print(obj.recall(in_data))
데이터 세트는이 같은 것입니다. 여기에서 처음 네 열은 지형지 물이며 마지막 열은 목표 값을 포함합니다. 데이터 세트에는 150 개의 레코드가 있습니다.
5.1,3.5,1.4,0.2,0
4.9,3.0,1.4,0.2,0
5.0,3.6,1.4,0.2,0
5.4,3.9,1.7,0.4,0
4.6,3.4,1.4,0.3,0
7.0,3.2,4.7,1.4,1
6.4,3.2,4.5,1.5,1
6.9,3.1,4.9,1.5,1
5.5,2.3,4.0,1.3,1
6.3,3.3,6.0,2.5,2
5.8,2.7,5.1,1.9,2
7.1,3.0,5.9,2.1,2
6.3,2.9,5.6,1.8,2
매 에포크 후 예측값은 기하 급수적으로 증가하고있다. 그리고 50 epoch 내에서 코드는 INF 또는 -INF를 출력으로 제공합니다. 신원 기능 대신, 나는 또한 누설 ReLU를 시도했지만, 여전히 출력은 INF였다. 또한 다양한 학습 속도, 숨겨진 레이어의 뉴런 수, 숨겨진 레이어 수, 초기 가중치, 반복 횟수 등을 시도했습니다. 그래서 어떻게 오류가 역 전파하는 신경 네트워크를 사용하여 회귀를 수행 할 수 있습니까?
귀하의 손실 기능은 무엇입니까? –
@Bastian Schoettle L = (0.5 * error * error) 여기서 error는 예측 된 값과 목표 값의 차이입니다. –