书上的代码:
class Relu:
def __init__(self):
self.mask = None#属性mask的类型为NoneType
def forward(self, x):
self.mask = (x <= 0)#self.mask是一个数组(大于0的为False,小于0的为True)
out = x.copy()#现在out和x的值相同了,但是改变out并不会影响到x
out[self.mask] = 0#将为True的值改为0
return out#返回的数组现在只有大于0的和等于0的了
def backward(self, dout):
#如果正向传播的输入值小于等于0,则反向传播的值等于0
dout[self.mask] = 0
dx = dout
return dx
怕自己看不懂数组的操作做的小小实验:
#p140
import numpy as np
x = np.array([1,3,-3,-4])
mask = (x <= 0)
print(mask)#[False False True True]
out = x.copy()
print(out)#[ 1 3 -3 -4]
print(out[mask])#[-3 -4]#打印出为True的值,这是改变前的值
out[mask] = 0#将为True(即小于0的数)的都赋值为0(只改变数组中那些原来为True对应的值)
print(out[mask])#[0 0]这是改变的内容
print(out)#[1 3 0 0]#改变后的数组out
print(x)#[ 1 3 -3 -4]说明copy方法并不会改变原来数组的值
aa = None
print(type(aa))#<class 'NoneType'>