RuntimeError: element 0 of tensors does not require grad and does not have a grad_

2023-05-16

文章目录

  • 1. 问题描述
  • 2. 解决方案
    • 2.1 方案1
    • 2.2 方案2
  • 3. 参考文献

1. 问题描述

今天在跑代码的过程中,因为要训练一个模型然后在测试阶段使用PGD来生成相应的adv_image来测试这个模型,结果运行到测试阶段出现下面的问题。

报错如下:
RuntimeError: element 0 of tensors does not require grad and does not have a grad_

我的代码如下:

def validate_roubst(val_loader, model, criterion, epoch, args, log=None, tf_writer=None, flag='roubst_val'):
    batch_time = AverageMeter('Time', ':6.3f')
    losses = AverageMeter('Loss', ':.4e')
    top1 = AverageMeter('Acc@1', ':6.2f')
    top5 = AverageMeter('Acc@5', ':6.2f')

    
    # switch to evaluate mode
    model.eval()
    all_preds = []
    all_targets = []
    
    
    with torch.no_grad():
        end = time.time()
        for i, (input, target) in enumerate(val_loader):
            if args.gpu is not None:
                # input = input.cuda(args.gpu, non_blocking=True)
                print('............')

            input = input.cuda(args.gpu, non_blocking=True)
            target = target.cuda(args.gpu, non_blocking=True)
            
            attack_method = PGD(model, args.device)
            adv_example = attack_method.generate(input, target, epsilon = 8/255, num_steps = 20, step_size = 0.01, clip_max = 1.0, clip_min = 0.0, print_process = False, bound = 'linf')

            # compute output
            output = model(adv_example)  # input
            loss = criterion(output, target)

            # measure accuracy and record loss
            acc1, acc5 = accuracy(output, target, topk=(1, 5))
            losses.update(loss.item(), input.size(0))
            top1.update(acc1[0], input.size(0))
            top5.update(acc5[0], input.size(0))

            # measure elapsed time
            batch_time.update(time.time() - end)
            end = time.time()

            _, pred = torch.max(output, 1)
            all_preds.extend(pred.cpu().numpy())
            all_targets.extend(target.cpu().numpy())

            if i % args.print_freq == 0:
                output = ('Test: [{0}/{1}]\t'
                            'Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
                            'Loss {loss.val:.4f} ({loss.avg:.4f})\t'
                            'Prec@1 {top1.val:.3f} ({top1.avg:.3f})\t'
                            'Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format(
                    i, len(val_loader), batch_time=batch_time, loss=losses,
                    top1=top1, top5=top5))
                print(output)
        cf = confusion_matrix(all_targets, all_preds).astype(float)
        cls_cnt = cf.sum(axis=1)
        cls_hit = np.diag(cf)
        cls_acc = cls_hit / cls_cnt
        output = ('{flag} Results: Prec@1 {top1.avg:.3f} Prec@5 {top5.avg:.3f} Loss {loss.avg:.5f}'
                .format(flag=flag, top1=top1, top5=top5, loss=losses))
        out_cls_acc = '%s Class Accuracy: %s'%(flag,(np.array2string(cls_acc, separator=',', formatter={'float_kind':lambda x: "%.3f" % x})))
        print(output)
        print(out_cls_acc)
        if log is not None:
            log.write(output + '\n')
            log.write(out_cls_acc + '\n')
            log.flush()

        tf_writer.add_scalar('loss/test_'+ flag, losses.avg, epoch)
        tf_writer.add_scalar('acc/test_' + flag + '_top1', top1.avg, epoch)
        tf_writer.add_scalar('acc/test_' + flag + '_top5', top5.avg, epoch)
        tf_writer.add_scalars('acc/test_' + flag + '_cls_acc', {str(i):x for i, x in enumerate(cls_acc)}, epoch)

     return top1.avg

2. 解决方案

出了问题当然要找到解决方案:

2.1 方案1

大多数人是说要加这一句:

loss.requires_grad_(True) #加入此句就行了

具体做法就是:

loss = criterion(output, target)
loss.requires_grad_(True) # 加入此句在这个位置

loss.backward()

但是经过本人尝试,还是没有什么用,因为我在train阶段不会 出现错误,只有在test阶段就报错。

2.2 方案2

回归本质,还是从报错的角度看,错误提示大致意思就是:元素不需要求梯度
然后我仔细瞅了瞅我那段代码,发现了一个可疑之处:with torch.no_grad()
最后仔细查看了这个东西的一些使用规则(参考文献1):

with torch.no_grad()则主要是用于停止autograd模块的工作,以起到加速和节省显存的作用,具体行为就是停止gradient计算,从而节省了GPU算力和显存,但是并不会影响dropout和batchnorm层的行为。

看到我上面加粗的字体了吧,原来使用with torch.no_grad()就不会自动求梯度了,因为我们使用PGD生成adv_image需要求梯度,所以加上with torch.no_grad()就导致了我们无法求梯度,最终出现了下面的错误。

故解决方案为:

将 with torch.no_grad() 去掉

3. 参考文献

1. Pytorch 中 model.eval() 和 with torch.no_grad() 的区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RuntimeError: element 0 of tensors does not require grad and does not have a grad_ 的相关文章

  • 如何动态更改 Angular 中元素的 id?

    我在循环中有一个元素 我只想更改它的 id 以避免冲突 我做了一些搜索 但似乎找不到任何东西 div div index div div 问题是当我调用 ngOnInit 时document getElementById index 1 它
  • 获取表单中的所有元素

    我想使用 Selenium 提交包含多个元素的表单 例如
  • 断言 VS 运行时异常

    我正在编写 API 因此我的 API 将从外部模块中使用 这是我无法弄清楚使用断言或什么的方法之一java lang IllegalArgumentException Adds translation of information to u
  • 我的代码发出错误“应用程序:不是过程”或“调用非过程”

    在执行我的代码期间 我在不同的方案实现中遇到以下错误 Racket application not a procedure expected a procedure that can be applied to arguments give
  • 如何从网页复制特定元素

    我的目标是从网页中获取特定的文本区域 想象一下 就好像您能够在页面上的任何位置绘制一个矩形 并且该矩形中的所有内容都将被复制到剪贴板中 我正在使用 FireBug 请随意建议其他解决方案 我已经搜索了插件或书签 但没有找到任何有用的东西 及
  • 制作 2 个子集向量,以便值在索引方向上不同

    我想从相同的数据中提取 2 个向量的子集 其中replace TRUE 即使两个向量可以包含相同的值 它们在同一索引位置也不能相同 例如 gt set seed 1 gt a lt sample 15 10 replace T gt b l
  • width() 和 height() 适用于没有 jQuery 的现代浏览器

    我正在尝试为弹性 div 实现一个简单的折叠 展开效果 即当元素的实际尺寸未通过 CSS 设置时 因此无法简单确定 所以我需要 jQuery 的 width 和 height 的等效项来表示任意元素 这些方法应该返回可分配给 style w
  • 旋转数组 LeetCode (189)

    问题如下 给定一个数组 将数组向右旋转 k 步 其中 k 为非负数 这是我的代码 class Solution public void rotate vector
  • Google Colab 驱动器安装(带下划线)无法正常工作

    直到昨天 1月20日 我还可以连接到另一个谷歌驱动器帐户 使用drive mount 但是当我今天尝试这个时 谷歌colab向我显示了这个错误 from google colab import drive drive mount conte
  • iOS 8 模拟器无法启动

    当我尝试在模拟器 iOS 8 0 上使用 Xcode 6 Beta 4 运行我的应用程序时 我总是收到此错误 无法启动 iOS 模拟器 其实我在这个网站上发现了一些类似的问题 我尝试了所有的答案 但仍然无法解决 我在 Xcode 6 Bet
  • JQuery 选择框和循环帮助

    谢谢阅读 我对 jQuery 有点陌生 我正在尝试制作一个可以包含在我所有网站中的脚本来解决一个总是让我发疯的问题 问题 带有长选项的选择框在 Internet Explorer 中会被截断 例如 这些选择框 http discoverfi
  • 两个自定义(角度)元素之间的通信

    两个自定义 角度 元素之间的通信 假设有两个自定义元素 login button
  • Keras 用于语义分割,flow_from_directory() 错误

    我试图使用我对 Keras 文档中示例代码的修改 该文档展示了在使用图像掩码代替标签的情况下如何设置 image datagen flow from directory 用于图像分割 我们在其中预测一个类 对于每个像素 顺便说一下 我设置了
  • Lua:“拖动”数组中的元素序列

    我正在尝试创建一个函数 将连续数量的元素 拖动 到数组中的新位置 并限制为数组的当前大小 其他项目应该围绕 拖动 的项目晃动 例如 如果我的数组有 7 个元素 并且我想拖动中间的三个 1 2 3 4 5 6 7 lt keys a b C
  • Jquery Draggables:删除元素会更改其他删除元素的位置

    当放置 放置元素 通过从一个 DIV 拖动到另一个 DIV 然后删除放置的 DIV 中的一个元素时 其中一些元素会更改位置 这是一个测试场景 http jsfiddle net TcYHW 8 http jsfiddle net TcYHW
  • Visual Studio 2015 如何禁用异常输出

    我正在制作一个带有更新和绘制的 C 应用程序 我发现更新确实很慢 尽管没有任何沉重的表达 在独立于 Visual Studio 启动我的应用程序后 我发现它的速度快了 100 倍 问题是 对于每个 try catch VStudio 都会在
  • jquery遍历新创建的元素

    我正在尝试在表中添加新行 并将它们保存到数据库中 首先 我使用 append 在表中追加行 tablename append tr td newly added row td tr 附加功能运行良好 我的页面显示了正确的结果 但是 我无法选
  • Delphi - 列表索引越界(4)

    我知道这个问题已经被提出了一百万次 但是 我无法理解为什么这段代码会抛出错误 我已经找到了导致错误的罪魁祸首 FOR 循环 但是 我没有看到它有任何问题 我收到错误 列表索引超出范围 4 function TNetwork FeedForw
  • 在Vue.js中,如何选择组件的节点元素? $refs 可能吗?

    因为我想选择组件的节点元素 所以我想也许我可以使用 refs Parent
  • 对其他元素值的 XSD 限制

    是否可以在 XSD 文档中对其他元素值进行限制 例如 我有国家和州元素 如果国家 地区等于美国 那么我需要限制指定枚举的状态元素值 否则状态可以只是固定长度的字符串 当前 XSD 的示例 始终将状态限制为枚举

随机推荐

  • 三菱PLC MC协议

    1 MC协议的目的 xff1a 允许外部设备读写PLC内部寄存器 2 协议格式 xff1a 通讯方式有RS485和TCP IP两种 xff0c 通讯格式有很多种 xff1a 3E 3C 4C 4E帧格式 xff0c 通讯内容分为二进制和AS
  • find和find_if用法

    一 find的用法 STL容器中有很多find xff0c 比如说set xff0c map 他们内部都有内置的find函数 xff0c 一般情况下 xff0c 如果我们用到这些容器 xff0c 那么我们直接用它的内置find就可以了 xf
  • QTreeView节点拖放

    拖放操作分为拖动 Drag 和放置 Drop 两种操作 xff0c 当拖动时需要把拖动的数据进行存储 称为编码 xff0c 数据存储为QMimeData类型的对象 称为放置数据 xff0c 当执行放置操作时需要把存储的数据读取出来 称为解码
  • OOD七大原则

    1 单一职责原则 xff08 Single Responsibility Principle xff09 一个类或一个接口只有一个职责 xff0c 有且仅有一个原因引起变化 2 开闭原则 xff08 Open Closed Principl
  • 微服务探索之路05篇jenkins构建net6和vue docker镜像到Harbor自动更新k8s服务镜像

    从1 4篇已经学习了docker Harbor k8s的基本用法 接下来进阶一下使用jenkins结合起来做到自动部署项目 1 安装jenkins 1 1前提条件 docker环境 xff0c 可参考第01篇安装docker本文使用的是li
  • linux为用户添加sudo权限

    一 linux为用户添加sudo权限 用sudo时提示 34 xxx is not in the sudoers file This incident will be reported 其中XXX是你的用户名 xff0c 这是止当前用户没有
  • pixhawk多线程编程

    金错刀 pixhawk多线程程序编写 pixhawk源码多线程程序的编写 主要是针对pixhawk源码进行第二次开发的学习笔记 xff0c 记录下以便日后查阅 期望达到的目标 添加一个app应用 xff0c 在nsh的后台中运行该应用 xf
  • [视觉惯性导航系列]相机标定工具--kalibr

    前言 有很多博主推荐kalibr进行相机标定 我参考博主 纷繁中淡定 Kalibr标定Intel D435i相机 完成相机标定 但是kalibr在安装过程中会出现很多令人头秃的报错信息 综合了网上好多人的方法 才完成 本文做一点记录 本文不
  • C++ Exception

    Exception type Derived types scattered throughout different library headers bad alloc Exception thrown on failure alloca
  • 什么是最优化问题(Optimization Problem)?

    最优化问题是人们在科学研究和生产实践中经常遇到的问题 1 人类所从事的一切生产或者社会活动均是有目的的 其行为总是在特点的价值观念或者审美取向的支配下进行的 xff0c 因此经常面临一个可行的甚至是最优化的方案的决策问题 这就是最优化问题
  • 单例模式(java代码实现)

    应用单例模式时 xff0c 类只能有一个对象实例 xff0c 这么做的目的是避免不一致状态 饿汉式单例 xff1a xff08 立即加载 xff09 饿汉式单例 public class Singleton1 指向自己实例的私有静态引用 x
  • C++函数后面加“:”的含义

    转载 xff1a C 43 43 函数后面加 xff1a 的含义 hhd1988的专栏 CSDN博客 1 c 43 43 成员函数后面跟 xff1a 表示的是赋值 xff0c 这是c 43 43 的特性 如下 xff1a A int aa
  • 因子图(factor graph)

    因子图 xff08 factor graph xff09 Factor Graph 是概率图的一种 xff0c 概率图有很多种 xff0c 最常见的就是Bayesian Network 贝叶斯网络 和Markov Random Fields
  • 词袋模型(Bag of Features,BOF)

    Bag of Features xff08 BOF xff09 对于程序而言这个人就是一堆像素嘛 xff0c 让它直接找的话它只能一个个像素的去比较然后返回最接近的了 xff08 近邻算法 xff09 但是现实中物体的形状颜色会发生变化 x
  • SNMPv3基于用户的安全模型USM及消息格式

    一 USM相关网址 SNMPv3使用了基于用户的安全模型USM RFC 3411 Architecture for SNMP Frameworks http www ietf org rfc rfc3411 txtRFC 3414 User
  • 超详细的python搭建区块链(下)

    在前面 超详细的python搭建区块链 xff08 中 xff09 我们搭建了一个简单的区块链 在这个简单的区块链能够实现交易 挖矿等基本功能 不过 xff0c 区块链上的节点应该是分散的 如果它们是分散的 xff0c 我们究竟如何确保它们
  • RuntimeError: Expected 4-dimensional input for 4-dimensional weight [32, 1, 5, 5]

    文章目录 1 问题引入2 运行报错3 代码4 分析原因5 解决办法6 完整代码7 参考文献 1 问题引入 今天在使用pytorch训练一个模型的 xff0c 数据集的读取是使用pytorch自带的函数来进行读取和预处理的 xff0c 网络使
  • 如何在Linux服务器上安装Anaconda(超详细)

    目录 1 安装Anaconda1 1 下载anaconda的安装包1 2 解决安装出现的bug1 3 安装anaconda1 4 点击Enter xff08 回车键 xff09 1 5 输入 yes1 6 继续点击 Enter1 7 输入
  • Pytorch实现FGSM(Fast Gradient Sign Attack)

    目录 1 相关说明2 相关简述3 代码实现3 1 引入相关包3 2 输入3 3 定义被攻击的模型3 4 定义FGSM攻击函数3 5 测试函数 4 可视化结果5 可视化对抗样本6 预训练模型下载7 训练模型8 完整代码 1 相关说明 最近在整
  • RuntimeError: element 0 of tensors does not require grad and does not have a grad_

    文章目录 1 问题描述2 解决方案2 1 方案12 2 方案2 3 参考文献 1 问题描述 今天在跑代码的过程中 xff0c 因为要训练一个模型然后在测试阶段使用PGD来生成相应的adv image来测试这个模型 xff0c 结果运行到测试