李沐 d2l Accumulator理解

文章介绍了Accumulator类,用于在多个变量上累加,包括初始化方法__init__、累加函数add、重置函数reset和获取值函数__getitem__。在机器学习训练中,常用于累加损失值、正确率等指标。
Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

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处的值

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值