Я пытался построить нейронную сеть с одним скрытым слоем с нуля. В части обратного распространения возникли некоторые проблемы.
В скрытом слое я использую активацию сигмоида, а в выходном слое я использую функцию softmax.
Для расчета градиента функции потерь по отношению к весу в слое-1 уравнение принимает вид:
, где
def back_prop(parameters,cache,X,Y):
m = X.shape[1]
#retriving parameters
W1 = parameters["W1"]
W2 = parameters["W2"]
A1 = cache["A1"]
A2 = cache["A2"]
Z1 = cache["Z1"]
Z2 = cache["Z2"]
#back propagation calculation
#calculating dL1,dL2 for updating W1 and W2
# loss for W2 #
xa = np.divide(Y,A2)+np.divide((1-Y),(1-A2)) #part of dA2 calculation
dA2 = (1/m) * np.sum(xa)
dZ2 = sigmoid_derivative(Z2)
dW2 = A2
dL2 = dA2*dZ2*dW2
# loss for W1 #
dA1 = W2
print(dA1.shape)
dZ1 = softmax_derivative(Z1)
print(dZ1.shape)
dW1 = X.T
print(dW1.shape)
dl0 = np.dot(dA2,dZ2.T)
print('shape dl0',dl0.shape)
dl1 = np.dot(dl0,dA1)
print('shape dl1',dl1.shape)
dl2 = np.dot(dl1,dZ1.T)
print('shape dl2', dl2.shape)
dL1 = np.dot(dl2,dW1) ###error : dimension for broadcasting is not satisfied
print('shape dL1',dL1.shape)
grads ={"dL1" : dL1,
"dL2" : dL2}
return grads
Я пытался сделать это с np.dot () и у меня возникли проблемы с размерностью. Размерность dL / dW1 не подходит, когда я иду на обновление W1.
Вот мой полный код и извините, поскольку он немного грязный в части обратного распространения.
https://gist.github.com/ipritom/30fcad0c74ab59e5b31e1daac1c1d1e7