《动手学深度学习》Accumulator累加器
部分代码因为样式原因看不清,忘记应该怎么改
鼠标选中之后或者右上角调成黑夜模式就能看清了
class Accumulator:
"""在n个变量上累加"""
def __init__(self, n):
self.data = [0.0] * n
def add(self, *args):
self.data = [a + float(b) for a, b in zip(self.data, args)]
def reset(self):
self.data = [0.0] * len(self.data)
def __getitem__(self, idx):
return self.data[idx]
1. Accumulator类
class Accumulator:
首先定义了一个Accumulator类,实现n个变量的累加
metric = Accumulator(n)
并且通过如上方式实例化一个Accumulator类
2. def __ init __(self,n)
def __init__(self, n):
python的特殊方法,是一种构造器,当一个实例被创建的时候被自动调用的初始化方法,即当调用 metric = Accumulator(n) 时自动调用该方法;
n是待累加的变量的个数。
self.data = [0.0] * n
data是一个list列表,初始化为[0.0]*n,如果n = 3,那么self.data = [0.0 , 0.0 , 0.0]
data 用于存储待累加的变量,如正确率、损失值,样例数等。
3. def add(self,*args)
def add(self, *args):
自定义的一个累加函数,*args传入了一个不定长的参数列表,如调用metric.add(float(l.sum()),accuracy(y_hat,y),y.numel())时,*args表示括号内的三个参数。
self.data = [a + float(b) for a, b in zip(self.data, args)]
方括号内是一个列表推导式,这里通过举例子的方式解释这行代码。
假设经过若干次累加 data = [2.0 , 3.0 , 4.0] ,传入的参数 args = [5.0 , 6.0 , 7.0 ]
第一次迭代 a = 2.0 , b = 5.0 ,结果为a + b = 7.0
第二次迭代 a = 3.0 , b = 6.0 ,结果为a + b = 9.0
第三次迭代 a = 4.0 , b = 7.0 ,结果为a + b = 11.0
结果就是self.data = [7.0 , 9.0 , 11.0]
这是调用metric.add()一次累加的结果
在实际训练时每次都会将该轮训练得到的损失值,正确率,以及该轮的样例数通过metric.add()传入Accumulator类进行累加。
4. def reset(self)
重置函数,将data列表置0
5.def getitem(self, idx)
获取data列表下标idx处的值
参考
李沐的深度学习Accumulator怎么理解_0 -> 1的博客-CSDN博客_accumulator函数
希望有所帮助,文中若有问题欢迎提出