Pytorch-detach()用法

目的:

神经网络的训练有时候可能希望保持一部分的网络参数不变,只对其中一部分的参数进行调整。或者训练部分分支网络,并不让其梯度对主网络的梯度造成影响.这时候我们就需要使用detach()函数来切断一些分支的反向传播.

1 tensor.detach()

返回一个新的tensor,从当前计算图中分离下来。但是仍指向原变量的存放位置,不同之处只是requirse_grad为false.得到的这个tensir永远不需要计算器梯度,不具有grad.

即使之后重新将它的requires_grad置为true,它也不会具有梯度grad.这样我们就会继续使用这个新的tensor进行计算,后面当我们进行反向传播时,到该调用detach()的tensor就会停止,不能再继续向前进行传播.

注意:

使用detach返回的tensor和原始的tensor共同一个内存,即一个修改另一个也会跟着改变

比如正常的例子是:

import torch

a = torch.tensor([1, 2, 3.], requires_grad=True)
print(a)
print(a.grad)
out = a.sigmoid()

out.sum().backward()
print(a.grad)

输出

tensor([1., 2., 3.], requires_grad=True)
None
tensor([0.1966, 0.1050, 0.0452])

1.1 当使用detach()分离tensor但是没有更改这个tensor时,并不会影响backward():

import torch
 
a = torch.tensor([1, 2, 3.], requires_grad=True)
print(a.grad)
out = a.sigmoid()
print(out)
 
#添加detach(),c的requires_grad为False
c = out.detach()
print(c)
 
#这时候没有对c进行更改,所以并不会影响backward()
out.sum().backward()
print(a.grad)
 
'''返回:
None
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
tensor([0.7311, 0.8808, 0.9526])
tensor([0.1966, 0.1050, 0.0452])
'''

参考

1.pytorch的两个函数 .detach() .detach_() 的作用和区别

  • 90
    点赞
  • 298
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
1D-Grad-CAM是一种基于梯度的可视化方法,用于理解深度学习模型在输入序列中的关注点。下面是使用Pytorch实现1D-Grad-CAM的步骤: 1. 首先,加载训练好的模型和输入序列。可以使用torchvision.models中的预训练模型,例如resnet18。 2. 然后,定义一个Grad-CAM类,该类包含一个前向传递函数和一个反向传递函数。前向传递函数计算模型输出和特定层的特征图,反向传递函数计算特征图相对于输出的梯度。 3. 接下来,使用Grad-CAM类计算输入序列的梯度。这可以通过将输入序列传递给前向传递函数,然后将输出和特定层的特征图传递给反向传递函数来完成。 4. 最后,将梯度与特征图相乘,并将结果求和。这将生成一个热力图,用于可视化模型在输入序列中的关注点。 下面是一个使用Pytorch实现1D-Grad-CAM的示例代码: ```python import torch import torch.nn as nn import torch.nn.functional as F from torchvision import models class GradCAM: def __init__(self, model, target_layer): self.model = model self.target_layer = target_layer self.feature_maps = None self.gradient = None def save_feature_maps(self, module, input, output): self.feature_maps = output.detach() def save_gradient(self, grad): self.gradient = grad.detach() def forward(self, x): for name, module in self.model.named_modules(): if name == self.target_layer: module.register_forward_hook(self.save_feature_maps) module.register_backward_hook(self.save_gradient) break output = self.model(x) output = F.softmax(output, dim=1) return output def backward(self): self.gradient = torch.mean(self.gradient, dim=[2, 3], keepdim=True) feature_maps_weights = torch.mean(self.gradient * self.feature_maps, dim=1, keepdim=True) cam = F.relu(torch.sum(feature_maps_weights * self.feature_maps, dim=1, keepdim=True)) cam = F.interpolate(cam, size=x.shape[-1], mode='linear', align_corners=False) cam = cam.squeeze() cam = cam - torch.min(cam) cam = cam / torch.max(cam) return cam # 加载模型和输入序列 model = models.resnet18(pretrained=True) x = torch.randn(1, 3, 224, 224) # 创建Grad-CAM对象并计算热力图 grad_cam = GradCAM(model, 'layer4') output = grad_cam.forward(x) output[:, 0].backward() cam = grad_cam.backward() # 可视化热力图 import matplotlib.pyplot as plt plt.imshow(cam.detach().numpy()) plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值