every blog every motto: Every step counts
1. 激活函数的实现
- 本节将计算图的思路应用到神经网络中,实现ReLU。
激活函数ReLU(Rectified Linear Unit)表达式如下:
y = x (x>0)
y = 0 (x<=0)
1. 1 代码部分
# Relu:
# 激活函数的实现
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
1.2 代码讲解:
1.2.1 mask部分
功能:将数组内的值按任意值划分(阈值),再转换成bool类型(大白话:随便选一个值(如:3),大于这个值的留下,小于这个值的去掉(或者反过来也行),简而言之:选择功能)
- 以阈值为0和1,为例
import numpy as np
x = np.array([3,2,-1,1])
print(x) # 输出 [3,2,-1,1]
mask = (x > 0)
print(mask)# 输出[ True True False True] 注: 大于0的输出True,小于0的输出False
mask = (x>1)
print(mask) # 输出[ True True False False]
注: mask = (x>0),大于0的输出True,小于0的输出False。主要功能,根据所选阈值,将阈值左右的值分别转换成bool类型
1.2.2 赋值部分
import numpy as np
x = np.array([3,2,-1,1])
print(x)
mask = (x < 0) # 小于0的为True,F,F,T,F
print(mask)
x[mask] = 0 # True的赋值为0
print(x) # 3,2,0,1
注: 根据上一部分转换成的bool类型,有选择的筛选掉不要的部分。
1.2.3 Relu函数的forward部分讲解
- 小于0的赋值为True,大于0的赋值为False
- 数组中True部分的赋值为0,
通过以上两步,实现了relu函数!!!
另:关于copy方法参考文献[1],关于np.array数组部分参考文献[2]
参考文献
[1] https://blog.csdn.net/u010712012/article/details/79754132
[2] https://blog.csdn.net/fu6543210/article/details/83240024