Loading

torch-1 tensor & optim

开个新坑, pytorch源码阅读…从python代码开始读起.

torch/

1.tensor.py

继承自torch._C._TensorBase , 包括各种操作,TODO:随后看cpp代码

  • __abs__, __iter__之类的内建方法

  • requires_grad属性是否需要求导

  • backward(self, gradient=None, retain_graph=None, create_graph=False) retain_graph表示是否在backward之后free内存

  • register_hook(self, hook) 每次gradients被计算的时候,这个hook都被调用。返回的handle提供remove hook的能力

  • v = Variable(torch.Tensor([0, 0, 0]), requires_grad=True)
    h = v.register_hook(lambda grad: grad * 2)  # double the gradient
    v.backward(torch.Tensor([1, 1, 1]))
    #先计算原始梯度,再进hook,获得一个新梯度。
    print(v.grad.data) #output [2,2,2]
    h.remove()  # removes the hook, 返回的句柄
    
2.random.py //TODO default_generator
3.serialization.py 模型的load, store等方法

torch/optim

一系列优化方法的集合, 基类是optimizer.py, 其余op都是继承这个类, 基础上实现op.step(), 初始化默认参数由__init__提供. 包括SGD, Adam, RMSProp等, 以SGD为例:

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
optimizer.zero_grad() #初始化
loss_fn(model(input), target).backward()
optimizer.step()
内部方法

state_dict() & load_state_dict()更新state, param两个成员, 提供serialize的方法. 理解是可以训练到某个过程中进行op参数的存储, 下次可以继续, 避免训练失败重新训练

add_param_group() transfer learning中将freeze固定层的参数加入训练时, 可以用该方法.

lr_scheduler 用来进行lr的调整, 动态decay

scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
    scheduler.step()
    train(...)
    validate(...)

tips:

  • id(k)获取object的单一标识,作为dict的key.
  • isinstance(obj, class or tuple) 判断obj是否是class的实例

06ef05bc-004d-4561-b9ba-842076c9884b

posted @   SunStriKE  阅读(25)  评论(0编辑  收藏  举报  
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示