23.5_导入dezero

23.5 导入dezero

这样,我们就得到了dezero包。在本步骤的step23.py代码文件中,可以编写下面这段代码。

steps/step23.py

if '__file__' in globals():
    import os, sys
    sys.path.append(os.path.join(os.pathdirname.__file__, '.')
import numpy as np
fromdezero import Variable
x = Variable(np.array(1.0))
y = (x + 3) ** 2
y.backup()
print(y)
print(x.grad)

运行结果

variable(16.0) 8.0

上面的代码首先通过if 'file' in globals():语句检查了'file'是否被定义为全局变量。如果以python命令的形式(如python steps23.py)运行代码,那么变量__file__会被定义。这时,代码将获取当前文件(step23.

py)的目录路径,并将其父目录添加到模块的搜索路径中。这样无论从哪里运行Python命令,dezero目录下的文件都会被正确导入。例如,命令行中既可以运行python steps/step23.py,也可以运行cd steps;python step23.py。本书的后续章节将省略添加模块搜索路径的代码。

搜索路径的代码是为了导入手头正在开发的dezero目录而临时添加的。如果DeZero是作为一个包安装的(比如通过pip installdezero安装),DeZero包将被配置在Python搜索路径中。这意味着用户不需要按照前面代码的方式手动添加路径。另外,在Python解释器的交互模式下或在Google Colaboratory等环境下运行代码时,__file__变量没有被定义。考虑到这一点(为了让step文件能够直接在Google Colaboratory中运行),在把父目录添加到搜索路径中时,增加了if'___file__inglobals():这行代码。

以上就是step23.py中的所有代码(没有省略的代码)。现在我们完成了DeZero框架的原型,今后将扩展dezero目录下的文件(模块)。

步骤24

复杂函数的求导

DeZero现在支持比较常见的运算符(+、*、-、/和**)。因此,用户可以像编写普通的Python程序一样编写代码。当你对复杂的数学表达式进行编码时,就能体会到这一点的可贵之处了。下面我们尝试求出几个复杂式子的导数。

本步骤要探讨的函数是优化问题中经常使用的测试函数。优化问题的测试函数是用来评估各种优化方法的函数。换言之,它们是用于基准测试(benchmark)的函数。这样的函数有好几种。维基百科的“用于优化的测试函数”(Test functions for optimization)页面将这类函数以图24-1的形式总结了出来

在本步骤中,我们将从图24-1中选择3个函数,尝试求出它们的导数。由此我们可以体会到DeZero的强大。下面先从简单的函数Sphere开始。

图24-1 优化问题中使用的基准测试函数列表(摘自维基百科)