0

여기 내 프로젝트입니다. 다음과 같이 구성됩니다. m = 24 여기서 m은 학습 예제의 수입니다. 3 개의 숨겨진 레이어와 입력 레이어; 각 층을 연결하는 3 세트의 무게; 데이터는 1x38이고 y (1x1)의 응답이 있습니다.신경망 결과가 생성되지 않습니다

import numpy as np 
x = np.array([ 
[1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0], 
[1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0], 
[0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0], 
[1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0], 
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1], 
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1], 
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0], 
[1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0], 
[0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0], 
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1], 
[1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0], 
[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], 
[1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0], 
[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0], 
[1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0], 
[0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0]]) 

y = np.array([ 
    [1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1,0]]).T 

w = np.random.random((38, 39)) 
w2 = np.random.random((39, 39)) 
w3 = np.random.random((39, 1)) 

for j in xrange(100000): 
    a2 = 1/(1 + np.exp(-(np.dot(x, w) + 1))) 
    a3 = 1/(1 + np.exp(-(np.dot(a2, w2) + 1))) 
    a4 = 1/(1 + np.exp(-(np.dot(a3, w3) + 1))) 
    a4delta = (y - a4) * (1 * (1 - a4)) 
    a3delta = a4delta.dot(w3.T) * (1 * (1 - a3)) 
    a2delta = a3delta.dot(w2.T) * (1 * (1 - a2)) 
    w3 += a3.T.dot(a4delta) 
    w2 += a2.T.dot(a3delta) 
    w += x.T.dot(a2delta) 
print(a4) 

여기서 결과는 다음과 같습니다

[[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.] 
[ 1.]] 
내가 잘못 됐을 경우

사람이 볼 수 ? 내 네트워크를 변경해야합니까? 나는 더 많은 숨겨진 레이어와 더 많은 메모리를 추가하여 하이퍼 파라미터를 실험 해 보았습니다.

+0

대신 내가 모든 작은 일을 코딩하고 싶은 경우 어떻게 매일 일 –

+2

코딩의 라이브러리를 사용하여 나를 위해

이 200 반복에 자신감 답변을 수렴? 라이브러리를 사용하기를 원한다면 이미 @WiLL_K –

+0

입니다. 그러면 다음과 같이 시작하십시오. _ 손실을 계산하고 있습니까? _. 그래디언트 디센트 함수는 어디에 있습니까? 예측하는 기능은 어디에 있습니까? –

답변

1

실수가 있다고 생각되는 몇 가지 실수가 있지만 어쩌면 단지 다른 구현이 있습니다.

그라데이션을 단계 크기로 곱할 때 그라디언트를 가중치에 추가해야합니다. 이것이 귀하의 가중치가 단 하나의 반복으로 최대 1.0을 기록하는 이유입니다.

이 :

w3 -= addBias(a3).T.dot(a4delta) * step 

은 또한, 나는 당신이 시그 모이 드 함수의 편미분에 대한 올바른 정립이 있다고 생각하지 않습니다

w3 += a3.T.dot(a4delta) 

이 같은이어야한다.

a3delta = a4delta.dot(w3.T) * (1 * (1 - a3)) 

가되어야한다 : 나는이 생각

a3delta = a4delta.dot(w3.T) * (a3 * (1 - a3)) 

당신은 또한 같은 제로의 주위에 당신의 무게를 초기화해야합니다

ep = 0.12 
w = np.random.random((39, 39)) * 2 * ep - ep 

대부분의 구현은 각 층에 바이어스 노드를 추가, 너는 그렇게하지 않는다. 그것은 약간 일을 복잡하게 만듭니다. 그러나 그것이 더 빨리 수렴 할 것이라고 생각합니다.

# Weights have different shapes to account for bias node 
w = np.random.random((39, 39)) * 2 * ep - ep 
w2 = np.random.random((40, 39))* 2 * ep - ep 
w3 = np.random.random((40, 1)) * 2 * ep - ep 

ep = 0.12 
w = np.random.random((39, 39)) * 2 * ep - ep 
w2 = np.random.random((40, 39))* 2 * ep - ep 
w3 = np.random.random((40, 1)) * 2 * ep - ep 

def addBias(mat): 
    return np.hstack((np.ones((mat.shape[0], 1)), mat)) 

step = -.1 
for j in range(200): 
    # Forward prop 
    a2 = 1/(1 + np.exp(- addBias(x).dot(w))) 
    a3 = 1/(1 + np.exp(- addBias(a2).dot(w2))) 
    a4 = 1/(1 + np.exp(- addBias(a3).dot(w3))) 

    # Back prop 
    a4delta = (y - a4) 
    # need to remove bias nodes here 
    a3delta = a4delta.dot(w3[1:,:].T) * (a3 * (1 - a3)) 
    a2delta = a3delta.dot(w2[1:,:].T) * (a2 * (1 - a2)) 

    # Gradient Descent 
    # Multiply gradient by step then subtract 
    w3 -= addBias(a3).T.dot(a4delta) * step 
    w2 -= addBias(a2).T.dot(a3delta) * step 
    w -= addBias(x).T.dot(a2delta) * step 
print(np.rint(a4))