Jupyter Notebook单元格函数修改后无需重启内核生效的方法
解决Jupyter Notebook中单元格内函数修改不生效的问题
问题分析
你遇到的问题核心是:尽管在单元格内重新定义了reshape_transform函数,但GradCAM实例可能仍持有旧函数的引用,导致修改后的逻辑无法生效——即使重新执行整个单元格,旧的函数对象可能因被其他变量(比如之前创建的GradCAM实例、模型关联缓存)持有而未被替换。
可行解决方案
方案1:将reshape_transform内嵌到run函数中
把reshape_transform的定义放到run函数内部,每次调用run时都会创建全新的reshape_transform函数实例,确保GradCAM初始化时拿到的是最新逻辑:
import pytorch_grad_cam as pgc def run(model, target_layers): # 每次调用run都会重新定义函数,保证逻辑是最新的 def reshape_transform(tensor, height=14, width=14): result = tensor[1:, :, :, :] result = result.permute(0, 3, 1, 2) return result cam = pgc.GradCAM( model=model, target_layers=target_layers, reshape_transform=reshape_transform ) run(model, target_layers)
方案2:清除旧的函数引用再重新定义
在单元格开头显式删除旧的reshape_transform和run函数,避免Jupyter命名空间中残留旧的函数对象:
import pytorch_grad_cam as pgc # 清除旧函数定义,确保命名空间无残留 del reshape_transform, run def reshape_transform(tensor, height=14, width=14): result = tensor[1:, :, :, :] result = result.permute(0, 3, 1, 2) return result def run(model, target_layers): cam = pgc.GradCAM( model=model, target_layers=target_layers, reshape_transform=reshape_transform ) run(model, target_layers)
额外注意事项
如果上述方案仍不生效,检查是否存在模型梯度缓存或GradCAM实例的残留引用:
- 在调用
run前执行model.zero_grad()清除模型梯度缓存 - 若存在全局的
cam变量,执行新单元格前先删除:del cam
内容的提问来源于stack exchange,提问作者CNDominic
相关产品推荐
相关产品推荐

