当前位置: 首页 > news >正文

d2l中各种内定函数的笔记

Accumulator()类与train_epoch_ch3

  首先看一下类的定义:

class Accumulator:  #@save"""在n个变量上累加"""def __init__(self, n):self.data = [0.0] * ndef 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]

这里首先对类里面的函数进行说明,第一个[0.0] * n

这里的n对应的是Accumulator(n)里面这个传入的参数,如果传入3,则data变成[0,0,0]

对于add(self, *args) :这里的self是刚刚初始化self.data,*args接收非关键字的传参可以是元组,或者是字符串

对于打包操作,如下图所示

a = [0, 0, 0]
b = [3, 7, 1]
zip(a, b)
>>>[(0, 3), (0, 7), (0, 1)]for i, j in zip(a, b):print(i, j)>>>0 30 70 1>>> zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(0, 0, 0), (1, 2, 3)]

  对应这个操作[a + float(b) for a, b in zip(self.data, args)],如上图返回值所示,a=0对应b=3,故第一项为3,其余返回值列表如下所示:

metric = Accumulator(3)
print(f'初始的metric.data:{metric.data}')
metric.add(3,7,1)
print(f'第1次调用add后,metric.data:{metric.data}')
metric.add(5,8,1)
print(f'第2次调用add后,metric.data:{metric.data}')
print(metric.data[0])初始的metric.data:[0.0, 0.0, 0.0]
第1次调用add后,metric.data:[3.0, 7.0, 1.0]
第2次调用add后,metric.data:[8.0, 15.0, 2.0]
8.0

总结:这个metric = Accumulator(3)将原始metric.data设定为[0,0,0]3个量,应用在训练中时:

def train_epoch_ch3(net, train_iter, loss, updater): #@save"""训练模型⼀个迭代周期(定义⻅第3章)"""# 将模型设置为训练模式if isinstance(net, torch.nn.Module):net.train()# 训练损失总和、训练准确度总和、样本数metric = Accumulator(3)for X, y in train_iter:# 计算梯度并更新参数y_hat = net(X)l = loss(y_hat, y)if isinstance(updater, torch.optim.Optimizer):# 使⽤PyTorch内置的优化器和损失函数updater.zero_grad()l.mean().backward()updater.step()else:# 使⽤定制的优化器和损失函数l.sum().backward()updater(X.shape[0])metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())# 返回训练损失和训练精度return metric[0] / metric[2], metric[1] / metric[2]

训练函数中传入这三个数,分别表示从0开始依次[a,b,c],a为一个bs中的损失函数,b为一个bs中的预测正确的数量,c为一个bs中y标签向量中的总元素个数(等同于len(y)),由于一个X,y为一个bs,迭代完所有train_iter后,则三个数对应整个训练集中的数。

补充一下train_iter中定义完bs=32后每个X,y是什么:

train_iter, test_iter = load_data_fashion_mnist(32, resize=64)
for X, y in train_iter:print(X.shape, X.dtype, y.shape, y.dtype)break>>>torch.Size([32, 1, 64, 64]) torch.float32 torch.Size([32]) torch.int64

http://www.xdnf.cn/news/827623.html

相关文章:

  • 使用 Nexus3 搭建 Maven 私服
  • oracle关于rownum的使用【oracle】
  • 襟翼是什么?——浅述飞控襟翼系统
  • BlockingQueue详解
  • AFNetworking详解
  • throwable_您想知道的所有关于Throwable的信息
  • Linux中usr是什么?其有何作用?
  • 解决飞Q 在win7下 找不到的问题
  • C#中三层架构UI、BLL、DAL、Model详解
  • 计算机单机取证(autopsy工具使用)
  • 加密狗是什么?一次性给您说全加密狗的概念
  • 如何在 Linux 上刷新 DNS 缓存?
  • 通俗易懂版经典的黑客入门教程
  • Ubuntu 离线安装gcc,g++,make等依赖包
  • Android RadioButton和CheckBox控件
  • Tombstone原理分析
  • 伺服电机驱动原理
  • 移动硬盘怎么加密?移动硬盘加密软件有哪些?
  • next数组、nextval数组的推导及C语言实现
  • 135 、137、139端口等主要用途
  • 安装教程 PyG(PyTorch Geometric)
  • C++------static_cast和dynamic_cast详解
  • HTML网页制作知识总结(简单易学)
  • 【建议收藏】Windows批处理(cmd/bat)常用命令总结
  • ubuntu下安装jdk
  • 关于代码评审(CodeReview)那些不得不说的事儿
  • 10大办公常用工具\网址分享(收藏一波)
  • 都2023了还不知道怎么GCC,今天就来教大家如何安装GCC
  • 关于代码混淆,看这篇就够了
  • 决策树模型