● 在神经网络的层的实现中,一般假定 forward() 和 backward() 的参数是NumPy数组。
● 激活函数 ReLU(Rectified Linear Unit):如果正向传播时的输入 x 大于0,则反向传播会将上游的值原封不动地传给下游。反过来,如果正向传播时的 x 小于等于0,则反向传播中传给下游的信号将停在此处。此结论可有ReLU函数及其导数得出,公式及其类LaTex代码如下所示。
% First Function
y=\left\{\begin{matrix}
x,x>0\\
0,x\leq 0
\end{matrix}\right.
% Second Function
\frac{{\partial y}}{{\partial x}}=\left\{\begin{matrix}
1,x>0\\
0,x\leq 0
\end{matrix}\right.
【ReLU层的Python实现代码】
import numpy as np
arr=np.array([[1,-1],[-2,2]])
class Relu:
def __init__(self):
self.mask=None
def forward(self,x):
self.mask=(x<=0)
out=x.copy()
out[self.mask]=0
return out
def backward(self,dout):
dout[self.mask]=0
dx=dout
return dx
relu_layer=Relu()
qian_out=relu_layer.forward(arr)
print(qian_out)
print("\n")
hou_out=relu_layer.backward(arr)
print(hou_out)
运行后,此代码的输出为:
[[1 0]
[0 2]]
[[1 0]
[0 2]]
【代码解析】
为了充分理解上面代码,下面给出一个测试样例。看懂后,就能充分理解上文的代码了。
arr=np.array([[1,-1],[-2,2]])
print(arr)
print("\n")
st=(arr<=0)
print(st)
print("\n")
arr[st]=99999
print(arr)
运行后,此测试样例代码的输出为:
[[ 1 -1]
[-2 2]]
[[False True]
[ True False]]
[[ 1 99999]
[99999 2]]