我处于理解backpropagation
的初期阶段,我试图自己实现它。基本后向传播实施不起作用
我试图使用的数据集是大小为(150,4)的虹膜数据集。
我只是担心backpropagation
而不是梯度下降,所以我只是在一个例子上尝试我的算法,看看我能否得到一个看似正确的输出。
但是,我的问题是试图让我的渐变为我的初始权重矩阵,我得到的形状错误。
我想我的网络是这样的 - 4输入,8个隐神经元,和1个输出神经元
我的代码如下。 错误是与最后一行,因为x的大小(4,1)和delta2的大小(8,8),所以我不能得到点产品我只是不明白我应该得到如果我按照其他来源正确地跟踪算法,那么正确的delta2大小。
from sklearn.datasets import load_iris
from keras.utils import to_categorical
import numpy as np
# LOAD DATA
data = load_iris()
X = data.data[:-20]
y = to_categorical(data.target[:-20])
# only 20 samples because we have a small dataset
X_test = data.data[-20:]
y_test = to_categorical(data.target[-20:])
# INIT WEIGHTS - will try to add bias later on
w1 = np.random.rand(np.shape(X)[1], h_neurons)
w2 = np.random.rand(h_neurons, 3)
def sigmoid(x, deriv=False):
if deriv:
return sigmoid(x)*(1-sigmoid(x))
else:
return 1/(1+np.exp(-x))
# Feed forward
x = X[1].reshape(4,1)
z1 = w1.T.dot(x) # need to transpose weight matrix
a1 = sigmoid(z1)
z2 = w2.T.dot(a1)
y_hat = sigmoid(z2,deriv=True) # output
# BACKPROP
y_ = y[1].reshape(3,1)
delta3 = np.multiply((y_hat - y_), sigmoid(z2, deriv=True))
dJdW2 = a1.dot(delta3) ## ERROR !!!
delta2 = np.dot(delta3, w2.T) * sigmoid(z1, deriv=True)
dJdW1 = np.dot(x.T, delta2) ## ERROR !!!
我认为我正确实施backpropagation
,但显然不是,能有人请指出我哪里错了?
我被卡住了,我查看了各种资源,计算dJdW(与权重有关的费用的导数)的代码大致相同。
也许这是相关的:您的预测是多类的,但您使用的是单个单元,并且假设预测是线性形式0-2。考虑使用三个S形输出单元(每个类一个),它应该工作得更好。 –
谢谢,我想到了这一点,尽管我仍然得到与我的delta矩阵大小相同的错误。 –