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)用于创建计算的“连接”,在“禁用反向传播模式”下它也是没有用的。