18.3_使用Config类进行切换

18.3 使用Config类进行切换

下面扩展DeZero,针对只进行正向传播的情况进行优化。首先需要建立一个能在“启用反向传播模式”和“禁用反向传播模式”之间切换的机制。为此,我们需要使用下面的Config类。Config是Configuration(配置)的缩写。

steps/step18.py

class Config: enable_backprop  $=$  True

如上面的代码所示,Config类是一个简单的类,它(目前)只有一个类属性,即布尔类型的 enable_backprop。这个属性表示“是否启用反向传播”,如果为True,则表示“启用反向传播模式”。

DeZero的“配置”数据只有一个。因此,Config类没有被实例化,而是作为类使用。类只有一个,而实例可以创建多个。因此,在前面的代码中,Config类被设计为拥有“类属性”。

定义了Config类之后,就可以让Function引用它来切换模式。实际代码如下所示。

steps/step18.py

class Function: def__call__(self,\*inputs): xs  $=$  [x.data for x in inputs] ys  $=$  self.forward  $\ast$  xs) if not isinstance(ys,tuple): ys  $=$  (ys,) outputs  $=$  [Variable(as_variable(y))for y in ys] if Config.enable_backprop: self_generation  $=$  max([x_generation for x in inputs]) #  $①$  设置“辈分” for output in outputs:
output.set creator(self) # ②设置“连接”  
selfinputs = inputs  
self.outputs = [weakref.ref(output) for output in outputs]  
return outputs if len(outputs) > 1 else outputs[0]

如上面的代码所示,只有当Configenable.Backprop为True时,程序才会执行反向传播的代码。在代码中,①处设置了“辈分”的值,该值用于确定反向传播时节点的遍历顺序,因此在“禁用反向传播模式”下不需要该值。此外,②的output.set creator(self)用于创建计算的“连接”,在“禁用反向传播模式”下它也是没有用的。