在 Pytorch 中执行优化时如何对变量应用界限?

2024-03-12

我正在尝试使用 Pytorch 进行非凸优化,试图最大化我的目标(因此在 SGD 中最小化)。我想限制因变量 x > 0,并且 x 值的总和小于 1000。

我认为我已经以斜坡惩罚的形式正确实施了惩罚,但我正在努力解决 x 变量的边界问题。在 Pytorch 中,您可以使用以下命令设置边界clamp但在这种情况下似乎不合适。我认为这是因为 optim 需要在幕后自由的渐变。完整的工作示例:

import torch
from torch.autograd import Variable
import numpy as np

def objective(x, a, b, c):   # Want to maximise this quantity (so minimise in SGD)
    d = 1 / (1 + torch.exp(-a * (x)))

    # Checking constraint 
    exceeded_limit = constraint(x).item()
    #print(exceeded_limit)

    obj = torch.sum(d * (b * c - x))

    # If overlimit add ramp penalty
    if  exceeded_limit < 0:
        obj = obj - (exceeded_limit * 10)
        print("Exceeded limit")

    return - obj

def constraint(x, limit = 1000): # Must be > 0
    return limit - x.sum()

N = 1000

# x is variable to optimise for 
x = Variable(torch.Tensor([1 for ii in range(N)]), requires_grad=True)
a = Variable(torch.Tensor(np.random.uniform(0,100,N)), requires_grad=True)
b = Variable(torch.Tensor(np.random.rand(N)), requires_grad=True)
c = Variable(torch.Tensor(np.random.rand(N)), requires_grad=True)

# Would like to include the clamp
# x = torch.clamp(x, min=0)

# Non-convex methodf
opt = torch.optim.SGD([x], lr=.01)

for i in range(10000):
    # Zeroing gradients
    opt.zero_grad()

    # Evaluating the objective
    obj = objective(x, a, b, c)

    # Calculate gradients
    obj.backward() 
    opt.step()
    if i%1000==0:  print("Objective: %.1f" % -obj.item())

print("\nObjective: {}".format(-obj))
print("Limit: {}".format(constraint(x).item()))

if torch.sum(x<0) > 0: print("Bounds not met")
if  constraint(x).item() < 0: print("Constraint not met")

任何关于如何施加边界的建议将不胜感激,无论是使用钳位还是其他方式。或者一般性地建议使用 Pytorch 进行非凸优化。这是我正在处理的问题的一个更简单且按比例缩小的版本,因此如果可能的话,我试图找到一个轻量级的解决方案。我正在考虑使用一种解决方法,例如使用指数函数转换 x 变量,但随后您必须缩放函数以避免正值变得无穷大,并且我希望能够设置约束具有一定的灵活性。


我和你遇到同样的问题。 我也想在 PyTorch 中的变量上应用边界。 我通过下面的方法3解决了这个问题。

你的例子有点复杂,但我仍在学习英语。 所以我下面举一个更简单的例子。

例如,有一个可训练变量v,其界限为 (-1, 1)

v = torch.tensor((0.5, ), require_grad=True)
v_loss = xxxx
optimizer.zero_grad()
v_loss.backward()
optimizer.step()

方式1。 RuntimeError:需要 grad 的叶变量已在就地操作中使用。

v.clamp_(-1, 1)             

方式2。运行时错误:尝试再次向后浏览图形,但缓冲区已被释放。

v = torch.clamp(v, -1, +1)  # equal to v = v.clamp(-1, +1)  

Way3. NotError。我在方法3中解决了这个问题。

with torch.no_grad():
    v[:] = v.clamp(-1, +1)  # You must use v[:]=xxx instead of v=xxx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pytorch 中执行优化时如何对变量应用界限? 的相关文章

  • 如何在pytorch中查看DataLoader中的数据

    我在 Github 上的示例中看到类似以下内容 如何查看该数据的类型 形状和其他属性 train data MyDataset int 1e3 length 50 train iterator DataLoader train data b
  • 使用 NumPy 索引数组对 Python 列表进行切片——有什么快速方法吗?

    我有一个常规的list called a 以及一个 NumPy 索引数组b 不 我不可能转换a到 NumPy 数组 有什么方法可以达到与 相同的效果 a b 有效 需要明确的是 这意味着我不想提取每个人int in b由于其性能影响 是的
  • 如何使用纯 GDI 对画布区域进行颜色混合(按指定的 alpha 值着色)?

    我想使用纯颜色混合画布区域 按指定的 alpha 值着色 Windows GDI http msdn microsoft com en us library dd145203 28v vs 85 29 aspx 因此没有 GDI Direc
  • PyPy 明显慢于 CPython

    我一直在测试我制作的缓存系统 其目的是加速 Django Web 应用程序 它将所有内容存储在内存中 根据 cProfile 我的测试中的大部分时间都花在 QuerySet clone 内 结果证明效率非常低 考虑到实现 这实际上并不奇怪
  • 如何让 CBC 在时限内返回最佳解决方案? (皮莫)

    我正在尝试在 Pyomo 上使用 CBC v2 10 3 来解决整数线性问题 执行求解器时 我当前设置的时间限制为 600 秒 opt SolverFactory cbc opt options seconds 600 在这个时间限制内 求
  • 使 K 不同(基数) google OR-TOOLS

    我想知道 google or tools 中是否存在 Solver AllDifferent x 的泛化 允许指定我允许的不同元素的数量 因此 如果 len x 4 则 AllDifferent x 意味着 len set x 4 但是 如
  • 如何加快这段 Java 代码的速度?

    我正在尝试测试 Java 执行一项简单任务的速度有多快 将一个大文件读入内存 然后对数据执行一些无意义的计算 所有类型的优化都很重要 无论是以不同的方式重写代码还是使用不同的 JVM 欺骗 JIT 输入文件是一个由逗号分隔的 5 亿长的 3
  • 计算编辑距离的最有效方法

    我刚刚实现了最佳匹配文件搜索算法来查找与字典中的字符串最接近的匹配项 对我的代码进行分析后 我发现绝大多数时间都花在计算查询与可能结果之间的距离上 我目前正在实现使用二维数组计算编辑距离的算法 这使得实现成为 O n 2 操作 我希望有人能
  • PyTorch:如何检查训练期间某些权重是否没有改变?

    如何检查 PyTorch 训练期间某些权重是否未更改 据我了解 一种选择可以是在某些时期转储模型权重 并检查它们是否通过迭代权重进行更改 但也许有一些更简单的方法 有两种方法可以解决这个问题 First for name param in
  • 从打包序列中获取每个序列的最后一项

    我试图通过 GRU 放置打包和填充的序列 并检索每个序列最后一项的输出 当然我的意思不是 1项目 但实际上是最后一个 未填充的项目 我们预先知道序列的长度 因此应该很容易为每个序列提取length 1 item 我尝试了以下方法 impor
  • 我可以在 Rust 中有效地按值返回对象吗?

    我想用函数初始化一个大对象 目前我有 fn initialize mydata mut Vec
  • mod_pagespeed 有什么作用?

    这是参考 http googlecode blogspot com 2011 01 go daddy makes web faster by enabling html http googlecode blogspot com 2011 0
  • 涉及优化器的局部变量构造和销毁

    如果我有这个代码 class A class B void dummy A a B b 我知道变量a and b将以相反的分配顺序销毁 b将首先被摧毁 然后a 但我可以确定优化器永远不会交换的分配和构造a and b 或者我必须使用vola
  • Pytorch Tensor 如何获取元素索引? [复制]

    这个问题在这里已经有答案了 我有 2 个名为x and list它们的定义如下 x torch tensor 3 list torch tensor 1 2 3 4 5 现在我想获取元素的索引x from list 预期输出是一个整数 2
  • 如何使用 UIImagePickerController 呈现 ViewController

    我试图提出一个ImagePicker 然后在用户选择图像后 呈现图像编辑ViewController用户可以在其中操作图像 然后将编辑后的图像发送回原始图像ViewController 问题 是否有一种标准或最佳实践方法从初始 ViewCo
  • CUDA 常量内存是否应该被均匀地访问?

    我的 CUDA 应用程序的恒定内存小于 8KB 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 如果是 如何确保所有线程同时访问同一地址 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 是的 这缓存本身每
  • 我可以让 C++ 编译器在编译时实例化对象吗?

    我正在编写一些代码 其中包含大量相当简单的对象 我希望它们在编译时创建 我认为编译器能够做到这一点 但我无法弄清楚如何做到 In C我可以执行以下操作 include
  • 读取 CSV 文件单列的更快方法

    我正在尝试阅读一个列CSV文件至R尽快 我希望将标准方法将列放入 RAM 所需的时间减少 10 倍 我的动机是什么 我有两个文件 一个叫Main csv这是 300000 行和 500 列 其中一个称为Second csv即 300000
  • 集合划分比差分获得更好的结果

    分区问题 https en wikipedia org wiki Partition problem已知是 NP 困难的 根据问题的特定实例 我们可以尝试动态规划或一些启发式方法 例如差分法 也称为 Karmarkar Karp 算法 后者
  • 是否已经有一些基于 std::vector 的 set/map 实现?

    对于小型集合或地图 通常使用排序向量而不是基于树的向量要快得多set map 特别是对于 5 10 个元素的情况 LLVM 有一些类本着这种精神 http llvm org docs ProgrammersManual html ds se

随机推荐