形参与实参的不对应导致ops.GradOperation执行报错:The parameters number of the function is 2, but the number of provi

本文主要是介绍形参与实参的不对应导致ops.GradOperation执行报错:The parameters number of the function is 2, but the number of provi,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.系统环境

硬件环境(Ascend/GPU/CPU): GPU

软件环境:

– MindSpore 版本: 1.7.0

执行模式: 静态图(GRAPH) – Python 版本: 3.7.6

– 操作系统平台: linux

2.报错信息

2.1 问题描述

自定义训练网络中,进行反向传播计算梯度时,少给ops.GradOperation传入了一个参数导致执行报错。

2.2 报错信息

TypeError: mindspore/ccsrc/pipeline/jit/static_analysis/stack_frame.cc:101 DoJump] The parameters number of the function is 2, but the number of provided arguments is 1.

2.3 脚本代码

class TrainOneStepCell(nn.Cell):
def __init__(self, network, optimizer, sens=1.0): super(TrainOneStepCell, self).__init__(auto_prefix=False) self.network = network self.network.set_grad() self.optimizer = optimizer self.weights = self.optimizer.parameters self.grad = ops.GradOperation(get_by_list=True, sens_param=True) def construct(self,*inputs): """Defines the computation performed.""" loss = self.network(*inputs) grads = self.grad(self.network, self.weights)(*inputs) self.optimizer(grads) return grads,loss 复制

复制

3.根因分析

 看报错信息,翻译意思就是函数的形参数为2,但提供的实参数为1。

 查看官网文档关于自定义训练网络的设置,再进行反向传播,计算梯度时需要将loss传入。原因是因为反向传播需要根据loss值进行计算。

4.解决方案

解决方案说明:根据官网文档,将loss值传入self.grad。

修改后代码:

class TrainOneStepCell(nn.Cell):

def __init__(self, network, optimizer, sens=1.0):super(TrainOneStepCell, self).__init__(auto_prefix=False)self.network = networkself.network.set_grad()self.optimizer = optimizerself.weights = self.optimizer.parametersself.grad = ops.GradOperation(get_by_list=True, sens_param=True)def construct(self,*inputs):"""Defines the computation performed."""loss = self.network(*inputs)grads = self.grad(self.network, self.weights)(*inputs,loss)self.optimizer(grads)return grads,loss

修改后,程序正常训练。

这篇关于形参与实参的不对应导致ops.GradOperation执行报错:The parameters number of the function is 2, but the number of provi的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337649

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja