9.1_作为Python函数使用

9.1 作为Python函数使用

此前,DeZero中使用的函数是作为Python的类实现的。举例来说,在使用Square类进行计算的情况下,我们需要编写如下代码。

$\mathbf{x} =$  Variable(np.array(0.5))  
f = Square()  
y = f(x)

上面的代码是分两步计算平方的:创建一个Square类的实例;调用这个实例。但是从用户的角度来看,分两步完成有点啰唆(虽然可以写成y = Square()(x),但观感很差)。用户更希望把DeZero的函数当作Python函数使用。为此,需要添加以下代码。

def square(x):
    f = Square()
    return f(x)
def exp(x):
    f = Exp()
    return f(x)

上面的代码实现了square和exp两个函数。这样我们就可以将DeZero的函数当作Python函数使用了。顺便提一下,上面的代码也可以像下面这样写成一行。

steps/step09.py

def square(x):
    return Square() (x) # 编写在一行内
def exp(x):
    return Exp() (x)

上面的代码没有像 f=Square()f = \text{Square}() 这样通过变量名 ff 来引用,而是直接写成了 Square()(x)\text{Square}()(\mathbf{x}) ,这样也是可以的。接下来我们使用一下前面实现的两个函数。

$\mathbf{x} =$  Variable(np.array(0.5))  
a  $=$  square(x)  
b  $=$  exp(a)  
y  $=$  square(b)  
y.grad  $=$  np.array(1.0)  
y.backup()  
print(x.grad)

运行结果

3.297442541400256

如上所示,用Variable封装np.array(0.5)后,就可以像使用NumPy进行计算一样来编码了。另外,函数现在也支持连续调用,示例代码如下所示。

$\mathbf{x} =$  Variable(np.array(0.5))  
y  $=$  square(exp(square(x))) # 连续调用  
y.grad  $=$  np.array(1.0)  
y_backward()  
print(x.grad)

运行结果

3.297442541400256

这样我们就可以编写更自然的代码进行计算。以上是第1项改进。