21.1_与ndarray一起使用

21.1 与ndarray一起使用

首先扩展Variable,使Variable实例能够与ndarray实例一起使用。实现这个目标很简单。比如有Variable实例a,在执行代码a * np.array(2.0)时,(在用户看不到的幕后)将这个ndarray实例转换为Variable实例。换言之,只要把该实例转换为Variable(np.array(2.0)),剩下的计算就和之前的一样了。

为此,我们要准备一个工具函数as_variable。该函数会把作为参数传来的对象转换为Variable实例。代码如下所示。

steps/step21.py
def as_variable(obj): if isinstance(obj, Variable): return obj return Variable(obj)

上面的代码假定参数obj是Variable实例或ndarray实例。如果obj是Variable实例,则不做任何修改直接返回。否则,将其转换为Variable实例并返回。

如下面的代码所示,我们在Function类的__call__方法的开头添加使用了as_variable函数的阴影部分的代码。

steps/step21.py
class Function: def__call__(self,\*inputs): inputs  $=$  [as_variable(x)forxin inputs] xs  $=$  [x.data for x in inputs] ys  $=$  self.forward(\*xs)

上面的代码会将作为参数传来的 inputs 中的各元素 x 转换为 Variable 实例。因此,如果传来的是 ndarray 实例,它将被转换为 Variable 实例。这样在后续的处理中,所有变量都会变成 Variable 实例。

DeZero中使用的所有函数(运算)都继承自Function类。在实际运算时,Function类的__call__方法会被调用。因此,如果像上面那样修改了Function类的__call__方法,这个修改将应用于DeZero中使用的所有函数。

下面使用新的DeZero做一些计算。示例代码如下所示

steps/step21.py   
 $\begin{array}{rl} & x = \mathrm{Variable(np.array(2.0))}\\ & y = x + np.array(3.0)\\ & \mathrm{print(y)} \end{array}$    
运行结果 variable(5.0)

这里运行了代码 y=x+np.array(3.0)y = x + np.array(3.0) 。从输出可以看出,结果是正确的。在代码内部,ndarray实例转换成了Variable实例。这样,ndarray和Variable就能一起使用了。

21.1_与ndarray一起使用 - 深度学习自制框架 | OpenTech