我正在尝试对1-S-1(S =神经元数)网络实施反向传播,以在输入(p)限制内近似实现以下功能:
只能通过对矩阵运算使用Numpy来实现近似。我将初始权重和偏差设置为在-0.5和0.5之间均匀分布的随机数,以训练网络。我还需要将神经元设置为2或10,以观察网络的差异/改进。学习率也将很灵活。可以将其设置为允许收敛的任何数字。
我正在使用的传递函数是sigmoid:
输出= 1 /(1 + e ^(-激活))
我对理解反向传播的概念仍然很不了解,并且正在尝试从头开始进行编程学习。但是,当我仍然感到困惑时,这是极其困难的。
我了解到,反向传播会从输出和目标集中逐层更新权重和偏差。 {(p1,t1),(p2,t2)....}。然后通过诸如以下的误差估计来更新权重和偏差:
错误=(预期-输出)* transfer_derivative(输出)
在下面的程序中,我试图通过反向传播来绘制近似函数,但我不知道如何为近似正弦图计算近似输出。任何澄清将不胜感激。 我现在的代码可能不完整,因为我停止了体重传播,并希望从那里获得一些帮助。
仅仅尝试自己学习它,感觉这是目前最难掌握的概念。
class backProg:
def __init__(self,P):
self.W1 = np.random.uniform(-1/2, 1/2, 20)
#self.W2 = np.random.uniform(-1/2, 1/2, 20)
self.B = np.random.uniform(-1/2, 1/2, 20)#include bias in input
def transfer_derivative(self, output):
deriv1 = output * (1.0 - output)
return deriv1
def logsig(self, p):
for i in range(len(p)):
w1 = np.zeros(len(self.W1))
a1 = w1
s2 = w1
x = self.W1[i]*p[i]+self.B[i]
a1[i] = 1/(1+np.exp(x))
deriv = self.transfer_derivative(a1)
t = 1 + np.sin((math.pi/2)*p[i])
#Second layer
s2[i] = -2*deriv*(t-a1[i])
w1[i] = self.W1[i] - 0.1*s2[i]*a1[i] #a1
#First layer
return w1, t, s2,a1
P = np.arange(-2,2,0.2)
backP = backProg(P)
backP.logsig(P)
尝试近似此正弦图:
p = np.arange(-2,2,0.2)
t = 1 + np.sin((math.pi/2)*p)
plt.plot(p,t,'C0')