【问题标题】:How to get the partial derivative of probability to input in pyTorch?如何获得概率的偏导数以输入pyTorch?
【发布时间】:2021-06-27 04:05:59
【问题描述】:

我想通过以下步骤生成攻击样本:

  1. 找一个预训练好的CNN分类模型,输入为X,输出为P(y|X),X最可能的结果是y。

  2. 我想输入X'得到y_fool,其中X'离X不远,y_fool不等于y

  3. 获取X'的步骤是:enter image description here

  4. 如何得到图中描述的偏导数?

这是我的代码,但我没有:(型号是 Vgg16)

x = torch.autograd.Variable(image, requires_grad=True)
output = model(image)
prob = nn.functional.softmax(output[0], dim=0)
    
prob.backward(torch.ones(prob.size()))
print(x.grad)

我应该如何修改我的代码?有人可以帮助我吗?我将不胜感激。

【问题讨论】:

    标签: pytorch conv-neural-network gradient gradient-descent


    【解决方案1】:

    这里的重点是通过网络反向传播一个“假”示例,换句话说,您需要最大化输出的一个特定坐标,该坐标与x 的实际标签不对应。

    例如,假设您的模型输出 N 维向量,x 标签应该是 [1, 0, 0, ...],并且我们将尝试让模型实际预测 [0, 1, 0, 0, ...](所以 y_fool 实际上有它的第二个坐标设置为 1,而不是第一个)。

    旁边的快速说明:Variable 已弃用,只需将 requires_grad 标志设置为 True。所以你得到:

    x = torch.tensor(image, requires_grad=True)
    output = model(x)
    # If the model is well trained, prob_vector[1] should be almost 0 at the beginning
    prob_vector = nn.functional.softmax(output, dim=0)
    # We want to fool the model and maximize this coordinate instead of prob_vector[0]
    fool_prob = prob_vector[1]
    # fool_prob is a scalar tensor, so we can backward it easy
    fool_prob.backward()
    # and you should have your gradients : 
    print(x.grad)
    

    之后,如果您想在循环中使用optimizer 来修改x,请记住pytorch optimizer.step 方法试图最小化损失,而您想最大化损失。因此,要么使用负学习率,要么更改反向传播符号:

    # Maximizing a scalar is minimizing its opposite
    (-fool_prob).backward()
    

    【讨论】:

      猜你喜欢
      • 2020-02-24
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2016-06-28
      • 1970-01-01
      相关资源
      最近更新 更多