如何使用 pytorch 找到最大化神经网络输出的输入

zez*_*ezo 8 optimization neural-network pytorch

我有一个 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   
Run Code Online (Sandbox Code Playgroud)

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

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

      
Run Code Online (Sandbox Code Playgroud)

Kon*_*kos 3

  1. 禁用网络的梯度。
  2. 将输入张量设置为需要梯度的参数。
  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()
Run Code Online (Sandbox Code Playgroud)

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