python中一些函数的泛泛理解

在python中我们为什么要使用contiguous呢?
①什么是contiguous呢?
答contiguous英语含义就是连接
②现实生活中遇到的问题:Tensor多维数组的底层实现是使用的连续内存的,而且在内存中是按行进行展开的,计算机可以通过多维索引号,找到其所相对应的一维数组的相对于数组的真实偏移,这样就可以找到多维索引中在一维(内存)中所对应的值。但是在实际Tensor的应用中(transpose、permute等操作)会使原来在语义上连续,内存中也连续的数据—>内存中不再连续。而python中的某些操作是需要在连续的情况下才可以做的(如view()操作)。因此我们需要将其进行连续化。
例子
在这里插入图片描述
example = relative_coords.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, 7, 7, 96)

在对抗学习-白盒对抗-的典型方法FGSM(Fast Gradient Sign Method)中有这样一段代码不很理解。现在摘出来进行分析。

adv_ex = perturbed_data.squeeze().detach().cpu().numpy()

一: squeeze是压缩的意思—说三种情况

如果不指定具体是哪一维度,那么函数squeeze就会将输入到函数中变量的维度中为一维的全部置为0。例子如下:

# 输入
a = torch.tensor([[[0], [1], [2]]])
print(a)
print(a.size())
print(a.squeeze().size())
# 输出为:
tensor([[[0],
         [1],
         [2]]])
torch.Size([1, 3, 1])
torch.Size([3])     # 这就是不指定维度的效果 将所有为1的都压缩了

如果指定了具体的维度,那么只针对具体的那一维进行压缩。例如:

# 与上面的代码是一起的
a = torch.tensor([[[0], [1], [2]]])
print(a.size())
# 输出为:
torch.Size([1, 3, 1])

print(a.squeeze(0).size())
# 输出为:
torch.Size([3, 1])
# 也可以这样写
print(a.squeeze(2).size())
# 输出
torch.Size([1, 3])

# 但是这种情况是没效果的。原因在于:函数squeeze只能压缩维度为1的情况,这种压缩在numpy中是直接报错的
print(a.squeeze(1).size())
# 输出
torch.Size([1, 3, 1])

③ 最后一个情况,但也是最重要,但最容易忽略的
在机器学习和深度学习中,通常算法的结果表示为向量型数组(即包含两对或以上的方括号形式[[]]),如果直接利用这个数组进行画图可能显示界面为空(甚至会直接报错)。我们可以利用squeeze()函数将表示向量的数组转换为秩为1的数组,这样利用matplotlib库函数画图时,就可以正常的显示结果了。
摘自——————o_Eagle_o

二:.detach()函数

detach:拆下的,使分离的
这个函数返回的是一个新张量,这个新的张量与原来的张量共享内存—一旦其中的某个值发生变化,另一个也会跟着发生变化。但不同的在于这个新的张量不再参与梯度的计算

# 如果不这样写,会出现如下错误:
RuntimeError: Can't call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.
翻译:
运行错误:无法在需要 grad 的张量上调用 numpy()。 建议改用 tensor.detach().numpy() 

三:.cpu().numpy()

默认前面得到的结果是在GPU上训练得到的,如果想要将CUDA(GPU)上的张量转化为numpy,那么就需要先将GPU上的张量转换到CPU上再转换为numpy。

小知识点:

python中全局变量的使用
如果我们想要在函数中修改全局变量,那么我们首先需要定义一个全局变量,
其次将在改变全局变量的函数中将其global化
eg:
max_accuracy, max_index = 0, 0

def demo():
	global max_accuracy, max_index
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值