17.5_代码验证
17.5 代码验证
下面我们在没有循环引用的新DeZero的基础上运行以下代码。
steps/step17.py
for i in range(10):
x = Variable(np.random.randint(10000)) # 大量数据
y = square(square(square(x))) # 进行复杂的计算上面的代码使用循环来多次进行计算。循环中的引用情况如图17-4所示。

图17-4 x和y被用户引用时的关系图
之后,从图17-4所示的状态开始进行下一个计算(for语句中的第2次计算)时,x和y将被覆盖。此时,用户就不能再次访问之前的计算图了。由于引用计数减至0,所以计算图中使用的所有内存会被立刻清除。这就解决了DeZero中循环引用的问题。

我们可以借助memory profiler(参考文献[11])等外部库来监测Python中的内存使用情况。实际监测前面代码的内存使用情况,可以发现内存的使用量没有增加。
步骤18
减少内存使用量的模式
在上一个步骤,我们学习了Python的内存管理。本步骤将针对DeZero的内存使用量进行两项改进。第1项改进是减少反向传播消耗的内存使用量,这项改进提供了立即清除无用导数的机制。第2项改进是提供“不需要反向传播时的模式”,该模式可以省去不必要的计算。