jsma实现流程
- 求前向导数
- 求显著性映射
- 更新
显著性映射找到了影响最大的两个像素点
循环中迭代次数是固定的,每次迭代,像素值增加theta
#get the saliency map and calculate the two pixels that have the greatest influence
p1, p2 = saliency_map(jacobian, var_target, increasing, search_domain, num_features)
var_sample_flatten = var_sample.view(-1, num_features)
var_sample_flatten[0, p1] += theta
var_sample_flatten[0, p2] += theta
为了找到超参数θ的含义,在查看实现代码的过程中遇到的一些troch中函数,在此记录一下。
DEEPSEC代码中注释多一点,advTorch几乎没有
torch.view()
类似于reshape 操作,操作对象可以是Tensor或者Variable。操作前提是tensor在内存中连续存放(contiguous,可用Tensor.is_contiguous()判断)。如果在view之前用了transpose, permute等,需要用contiguous()来返回一个contiguous copy。
可以用tensor.max( tensor.view ( -1,size * size ) ) 求最大的值和idx
详细解释见 PyTorch中的contiguous
torch.stack()
dim=0时,则就是讲[]中的n个矩阵变成n维,按照顺序,第i维是第i个矩阵,size=(i,x,y)
dim=1是,将列表[]中的每个矩阵的第一行组成第一维矩阵,依次下去,每个数组第n行组成第n维数组。size=(n,i,y)
dim=2是,讲列表[]中的
-
每个矩阵的第一行的第一个值,组成第一维的第一行,每一个矩阵的第一行第二个值组成第一维的第二行,以此类推,,每一个矩阵的第一行第n个值,组成第一维的第n行。
-
每个矩阵的第二行的第一个值,组成第二维的第一行,每一个矩阵的第二行第二个值组成第二维的第二行,以此类推,每一个矩阵的,第二行第n个值,组成第二维的第n行。
-
以此类推
每个矩阵的第n行的第一个值,组成第n维的第一行,每一个矩阵的第n行第二个值组成第n维的第二行,以此类推,每一个矩阵的,第n行第n个值,组成第n维的第n行。size=(n,y,i)
torch.remainder(input, divisor, out=None)
说明: 返回一个新张量,包含输入input张量每个元素的除法余数。除数与被除数可能同时包含整数或浮点数,余数与除数有相同的符号
参数:
input(Tensor) – 被除数
divisor(Tensor or float) – 除数,一个数或者与除数相同大小的张量
out(Tensor,可选) – 输出张量
dim() → int
返回tensor的维数
torch.eq(input, other, out=None) → Tensor
说明: 比较元素相等性。第二个参数可为一个数或与第一个参数同类型形状的张量。
参数:
- input (Tensor) – 待比较张量
- other (Tensor or float) – 比较张量或数
- out (Tensor,optional) – 输出张量,须为 ByteTensor类型 or 与input同类型
torch.gt(input, other, out=None) → Tensor
说明: 逐元素比较input和other , 即是否input[i] > other[i] 如果两个张量有相同的形状和元素值,则返回True ,否则 False。 第二个参数可以为一个数或与第一个参数相同形状和类型的张量
- input (Tensor) – 要对比的张量
- other (Tensor or float) – 要对比的张量或float值
- out (Tensor, optional) – 输出张量。必须为ByteTensor或者与第一个参数tensor相同类型。
torch.lt(input, other, out=None) → Tensor
说明: 逐元素比较input和other , 即是否 input < other,其他同上
numpy.prod(a, axis=None, dtype=None, out=None,)
Return the product of array elements over a given axis.元素相乘结果,可指定axis
any(),long()
python 内置函数 any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
元素除了是 0、空、FALSE 外都算 TRUE。
python 内置函数 long() 函数将数字或字符串转换为一个长整型,类似于float()