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.pydef as_variable(obj): if isinstance(obj, Variable): return obj return Variable(obj)上面的代码假定参数obj是Variable实例或ndarray实例。如果obj是Variable实例,则不做任何修改直接返回。否则,将其转换为Variable实例并返回。
如下面的代码所示,我们在Function类的__call__方法的开头添加使用了as_variable函数的阴影部分的代码。
steps/step21.pyclass 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)这里运行了代码 。从输出可以看出,结果是正确的。在代码内部,ndarray实例转换成了Variable实例。这样,ndarray和Variable就能一起使用了。