Я пытался закодировать двухслойный NN в numpy. Находясь на нем, я обнаружил это странное поведение в том, как матрица w0 меняет свою форму при входе в цикл. Форма для w0
равна (3,1)
, а для X
это (4,3)
. Результат должен быть (4,1)
, но вместо этого, когда программа входит в цикл, w0
становится (4,4)
. Вне цикла, это работает просто отлично. Кроме того, это происходит, когда я использую np.dot(X,w0)
, но прекрасно работает, когда я использую np.dot(w0.T,X.T)
. Вот код:
def sigmoid(x, deriv=False):
if deriv == True:
return x*(1-x)
return 1/(1+np.exp(-x))
X = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])
y = np.array([0,0,1,1]).T
w0 = np.random.normal(0,0.1,(3,1))
w0.shape
for iter in range(10000):
#forward propagation
#l0 = X
multiply = np.dot(X,w0)
if iter == 1: print(multiply.shape)
l1 = sigmoid(multiply)
if iter == 1:
print(w0)
print(multiply.shape)
print(X.shape)
print(w0.shape)
print(l1.shape)
#Calculating error:
error = y-l1
if iter == 1: print(error.shape)
#Backpropagating for update
d_l1 = error*sigmoid(l1, True)
if iter == 1: print(d_l1.shape)
#Update weights : Shape -- (4*3).T * (4*1) = (3*1)
w0 = w0 + np.dot(np.transpose(X), d_l1.T)
print ('Results after training:')
print (l1)