self.register_buffer方法使用解析(pytorch)

self.register_buffer就是pytorch框架用来保存不更新参数的方法。

列子如下:

c 复制代码
self.register_buffer("position_emb", torch.randn((5, 3)))

第一个参数position_emb传入一个字符串,表示这组参数的名字,第二个就是tensor形式的参数torch.randn((5, 3),并一次初始化后保存于模型,不会有梯度传播给它,能被模型的model.state_dict()记录下来,可以理解为模型的常数。当然,你想保留固定值,使用如下代码:

c 复制代码
self.register_buffer("position_emb", torch.tensorrt([[2,5],[8,9]]))

进一步探讨训练对该参数是否有影响,答案是:没影响。具体可看下面实现的列子代码:

c 复制代码
import torch
from torch.nn import Embedding

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.emb = Embedding(5, 3)
        self.register_buffer("position_emb", torch.randn((5, 3)))
    def forward(self,vec):
        input = torch.tensor([0, 1, 2, 3, 4])
        emb_vec1 = self.emb(input)
        emb_vec1=emb_vec1+self.position_emb
        output = torch.einsum('ik, kj -> ij', emb_vec1, vec)
        return output
def simple_train():
    model = Model()
    vec = torch.randn((3, 1))
    label = torch.Tensor(5, 1).fill_(3)
    loss_fun = torch.nn.MSELoss()
    opt = torch.optim.SGD(model.parameters(), lr=0.015)
    print('初始化后position_emb参数:\n',model.position_emb)
    for iter_num in range(100):
        output = model(vec)
        loss = loss_fun(output, label)
        opt.zero_grad()
        loss.backward(retain_graph=True)
        opt.step()
    print('训练后position_emb参数:\n', model.position_emb)

if __name__ == '__main__':
   simple_train()  # 训练与保存权重

实现结果如下:

相关推荐
Yunzenn12 小时前
深度解析字节前沿研究-Cola DLM第 04 章:Cola DLM 架构全景 —— 三层解耦的设计哲学
java·linux·python·深度学习·面试·github·transformer
冬奇Lab12 小时前
Agent系列(三):Plan-and-Solve——先想清楚,再动手
人工智能·llm·agent
冬奇Lab12 小时前
每日一个开源项目 #110:ai-engineering-from-scratch - 从零构建 AI 工程全栈能力
人工智能·深度学习·llm
夜郎king12 小时前
基于 Trae Solo 的 Ant 遗留项目编译方案 —— 以 BaseformEpanet 为例
人工智能·trae solo·水力模型·java水力模型编译
测试员周周12 小时前
【Appium 系列】第20节-测试项目结构设计 — 从脚本到工程
人工智能·数据挖掘·回归·单元测试·appium·测试用例·测试覆盖率
ujainu12 小时前
CANN pto-isa:Transformer 推理编译链路:从 PyTorch 到昇腾 NPU 执行
pytorch·深度学习·transformer·ascend
秣厉科技12 小时前
【番外】04:Python 和 LabVIEW 对接 DeepSeek API
python·labview·deepseek
IT_陈寒12 小时前
SpringBoot自动配置偷偷给我埋了个坑
前端·人工智能·后端
一切皆是因缘际会12 小时前
AI 从 “模仿智能” 到 “重构世界” 的范式跃迁
大数据·人工智能·深度学习·重构·架构
小新同学^O^12 小时前
简单学习 --> 限流和熔断
数据库·python·学习