1
하나의 숨겨진 레이어와 시그 모이 드 활성화 기능을 가진 신경망에 대한 배치 기반 역 전파 알고리즘을 구현합니다. 출력 레이어는 1 핫 시그 모이 드 레이어입니다. 첫 번째 레이어의 그물은 z1입니다. 시그 모이 드를 적용한 후에는 a1이됩니다. 비슷하게 두 번째 레이어에는 z2와 a2가 있습니다.신경망 손실이 감소하지만 정확도가 증가하지 않을 때?
x, y = train_data, train_target
for i in range(0, num_passes):
# call
z1, a1, z2, a2 = predict(current_model, x)
# recall
derv_out2 = (y - a2) * (a2 * (1 - a2))
delta2 = np.matmul(np.transpose(a1), derv_out2)/train_size
dw2 = delta2 + reg_lambda * w2
db2 = np.mean(b2 * derv_out2, 0)
derv_out1 = a1 * np.reshape(np.sum(delta2 * w2, 1), [1, a1.shape[1]])
delta1 = np.matmul(np.transpose(x), derv_out1)/train_size
dw1 = delta1 + reg_lambda * w1
db1 = np.mean(b1 * derv_out1, 0)
# gradient descent parameter update
w1 += learning_rate * dw1
b1 += learning_rate * db1
w2 += learning_rate * dw2
b2 += learning_rate * db2
# assign new parameters to the model
current_model = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}
전체 코드 파일 :
백 전파 과정은 다음과 같이이다 link
위의 알고리즘의 손실이 감소하고 있지만, 분류의 정확성에 대한 임의 선택이 될 것입니다. 문제가 무엇입니까?
정확도 메트릭은 간단한 av (합계 (1 또는 0))이지만 손실량은 전체 출력 벡터와 원하는 값의 비교를 기반으로합니다. 그물을 실행할 때 진실/거짓 정확도 테스트가 나아지지 않으면 서 출력 벡터 차이가 더 작아 질 수 있습니다. 당신의 손실을 단순화한다면 ... – bivouac0
'np.sqrt (np.sum (np.square (output - target)))'''learning_rate = 1.0'을 설정하면 정확도와 손실 모두를 볼 수 있습니다. 약간의 반복과 많은 변화를주지 않는다. 더 큰 문제는 여기에 잘못된 업데이트를 제공하는 델타 계산 오류입니다. (여기 여러 의견에 대해 죄송합니다 - 우연히 사고로 입력하십시오) – bivouac0
재미로 저는 최적화 코드/모델을 Keras의 해당 코드로 대체했습니다. SDG 최적화와 50,000의 배치 크기를 사용하여 최적화하지 않았습니다 (적어도 적절한 시간에는 그렇지 않았습니다). 배치 크기를 128로 변경하면 백 에포크 정도가 최적화됩니다. 최적화 도구를 RMSProp (128 배치)로 전환하면 첫 번째 기점 이후에 최적화 된 최적화가 이루어졌습니다. 데이터를 처리 할 수있는 최적화 알고리즘이 충분하지 않을 수 있습니다. 이런 식으로해야한다면 작은 배치 크기와 많은 반복을 시도 할 것입니다. – bivouac0