Chainer 中的渐变剪裁

Posted

技术标签:

【中文标题】Chainer 中的渐变剪裁【英文标题】:A gradient clipping in Chainer 【发布时间】:2020-01-23 04:25:42 【问题描述】:

我可以在 Chainer 中获得渐变剪裁功能吗?

我在 Pytorch 文档中找到了一些代码:https://pytorch.org/docs/stable/_modules/torch/nn/utils/clip_grad.html

Chainer 中是否有类似替代功能的东西? 我刚刚找到了chainer.optimizer_hooks.GradientClipping,但这很难使用。

提前致谢。

【问题讨论】:

为什么你实际上需要一个单独的函数呢?基本上,您希望在优化过程中使用梯度裁剪,这就是它被实现为优化器挂钩的原因。 【参考方案1】:

试试这个怎么样。 只是我只是用 Chainer 风格重写了 pyTorch 函数。

import cupy
def clip_grad_norm(model, max_norm, norm_type=2):
    params  = list( filter(lambda p : p.grad is not None ,  model.params()) )
    max_norm = float(max_norm)
    norm_type = float(norm_type)
    total_norm = 0.0
    for p in params:
        g = p.grad
        norm = cupy.linalg.norm(g)
        total_norm += norm**(norm_type)
    total_norm = total_norm **(1/norm_type)
    clip_coef = max_norm / (total_norm + 1e-6)
    if clip_coef < 1:
        for p in params:
            g = p.grad
            p.grad = g * clip_coef

【讨论】:

以上是关于Chainer 中的渐变剪裁的主要内容,如果未能解决你的问题,请参考以下文章

CoreGraphics - 用笔划剪裁渐变

Chainer 库的 `__init__.py` 文件中的“#NOQA”是啥意思? [复制]

如何在OpenGL中的对象空间坐标中获得近剪裁平面坐标

Swift 中的圆 - 无法摆脱剪裁

解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

HRGN 剪裁区域