Я никогда не пытался работать с нейронными сетями. Так что я не до конца понимаю, что вы пытаетесь сделать.
Я предполагаю, что есть некоторая путаница относительно того, как a * b
работает, если a & b являются матрицами, а не массивами. В numpy массивах * выполняется поэлементное умножение, в np.matrices - умножение матриц.
a=np.array([[1,2],[3,4]])
b = a-1
print(b)
# array([[0, 1],
# [2, 3]])
a*b # Element wise multiplication
# array([[ 0, 2], [[ 1*0, 2*1 ],
# [ 6, 12]]) [ 3*2, 4*3 ]]
am = np.matrix(a)
bm = np.matrix(b)
am * bm # Matrix (dot) multiplication
# matrix([[ 4, 7], [[ 0*1+1*2, 1*1+2*3],
# [ 8, 15]]) [ 1*2+2*3, 3*1+4*3]]
В функции Derive_sigmoid (без np.array), если x - это матрица, то fx - это матрица с той же формой (3,1). fx * (1-fx)
когда fx является (3,1) -матрицей, возникает исключение, поскольку две (3,1) -матрицы не могут быть умножены вместе.
Та же проблема применяется в части кода "# backprop".
d_ypred_d_a1 = W2 * deriv_sigmoid(z2) # deriviative of y prediction with respect to hidden activation
# W2 * deriv_sigmoid(z2) fails as shapes are incompatible with matrix multiplication.
# deriv_sigmoid(z2) * W2 would work, but I guess would return incorrect values (and shape).
d_a1_d_W1 = inp * deriv_sigmoid(z1)
# This fails for the same reason. The shapes of ing and z1 are incompatible.
Если вам не нужно умножение матриц, я думаю, что использование np.arrays облегчит программирование.