You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:13:19