【问题标题】:How to find input that maximizes output of a neural network using pytorch如何使用pytorch找到最大化神经网络输出的输入
【发布时间】:2021-07-23 10:55:08
【问题描述】:

我有一个 pytorch 网络,已经过训练并更新了权重(完成训练)。

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1, H)
        self.fc2 = nn.Linear(1, H)
        self.fc3 = nn.Linear(H, 1)

    def forward(self, x, y):
        h1 = F.relu(self.fc1(x)+self.fc2(y))
        h2 = self.fc3(h1)
        return h2   

训练后,我想最大化网络相对于输入的输出。换句话说,我想优化输入以最大化神经网络输出,而不改变权重。我怎样才能做到这一点。 我的试验,但它没有意义:

in     = torch.autograd.Variable(x)
out    = Net(in)
grad   = torch.autograd.grad(out, input)

      

【问题讨论】:

    标签: optimization neural-network pytorch


    【解决方案1】:
    1. 为网络禁用梯度。
    2. 将输入张量设置为需要 grad 的参数。
    3. 初始化包装输入张量的优化器。
    4. 带有一些损失函数和目标张量的反向传播
    5. ...
    6. 利润!
    import torch
    
    f = torch.nn.Linear(10, 5)
    f.requires_grad_(False)
    x = torch.nn.Parameter(torch.rand(10), requires_grad=True)
    optim = torch.optim.SGD([x], lr=1e-1)
    mse = torch.nn.MSELoss()
    y = torch.ones(5)  # the desired network response
    
    num_steps = 5  # how many optim steps to take
    for _ in range(num_steps):
       loss = mse(f(x), y)
       loss.backward()
       optim.step()
       optim.zero_grad()
    

    但请确保您的目标张量已明确定义。网络的单调性,否则你可能会得到 nans。

    【讨论】:

    • 为什么要用MSELoss,损失不应该是-f(x)吗?既然要最大化f(x)
    • 最小化 y(你的目标)和 f(x) 之间的距离更一般——只要 y 达到你的目标应该是什么
    • 是的,但我认为这里没有固定的目标,目标是最大化输出,使其尽可能大。那么你的y 会是什么?我认为可以将损失本身用作-f(x) 来捕获预期目标。
    • 一个包含任意高值的向量,理想情况下设置为网络共域的上边界(如果有的话)。
    • 好的,这似乎有点令人费解,但我认为优化了同样的事情。
    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 2019-01-10
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多