《动手学深度学习》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函数


希望有所帮助,文中若有问题欢迎提出

posted @ 2023-01-14 21:03  云北海  阅读(1745)  评论(1编辑  收藏  举报