Adam优化器错误:梯度运算所需的变量之一已通过就地操作进行了修改

载重

我正在尝试实现Actor-Critic学习自动演算算法,该算法与基本的actor-critic算法不同,但变化不大。

无论如何,我使用了Adam优化器并通过pytorch实现

当我首先将“批评家”的TD错误向后退时,没有任何错误。但是,我对Actor感到后退,发生了错误。

-------------------------------------------------- ------------------------- RuntimeError Traceback(最近一次通话最后一次)在46#update Actor Func 47optimizer_M.zero_grad()---> 48 loss.backward()49optimizer_M.step()50

〜\ Anaconda3 \ lib \ site-packages \ torch \ tensor.py向后(自我,渐变,retain_graph,create_graph)100个产品。默认为False101“”“-> 102 torch.autograd.backward(自己,渐变,retain_graph,create_graph)103104 def register_hook(自己,钩子):

〜\ Anaconda3 \ lib \ site-packages \ torch \ autograd__init __。py向后(张量,grad_tensors,retain_graph,create_graph,grad_variables)88变量._execution_engine.run_backward(89张量,grad_tensors,retain_graph,create_graph,-> 90 allow_unreachable = True)#allow_unreachable标志91 92

RuntimeError:梯度运算所需的变量之一已通过就地操作进行了修改

以上是错误内容

我试图找到就地操作,但是在我的书面代码中没有找到。我想我不知道如何处理优化程序。

这是主要代码:

        for cur_step in range(1):   
        action = M_Agent(state, flag)  
        next_state, r = env.step(action)   

        # calculate TD Error
        TD_error = M_Agent.cal_td_error(r, next_state)

        # calculate Target
        target = torch.FloatTensor([M_Agent.cal_target(TD_error)])
        logit = M_Agent.cal_logit()
        loss = criterion(logit, target)

        # update value Func
        optimizer_M.zero_grad()
        TD_error.backward()
        optimizer_M.step()

        # update Actor Func
        loss.backward()
        optimizer_M.step()

这是代理商网络

    # Actor-Critic Agent
    self.act_pipe = nn.Sequential(nn.Linear(state, 128),
                            nn.ReLU(),
                            nn.Dropout(0.5),
                            nn.Linear(128, 256),
                            nn.ReLU(),
                            nn.Dropout(0.5),
                            nn.Linear(256, num_action),
                            nn.Softmax()
                            )

     self.val_pipe = nn.Sequential(nn.Linear(state, 128),
                            nn.ReLU(),
                            nn.Dropout(0.5),
                            nn.Linear(128, 256),
                            nn.ReLU(),
                            nn.Dropout(0.5),
                            nn.Linear(256, 1)
                            )


      def forward(self, state, flag, test=None):

          temp_action_prob = self.act_pipe(state)
          self.action_prob = self.cal_prob(temp_action_prob, flag)
          self.action = self.get_action(self.action_prob)
          self.value = self.val_pipe(state)

          return self.action

我想分别更新每个网络。

我想知道基本TD Actor-Critic方法将TD错误用于损失?或r + V(s')和V(s)之间的平方误差?

麦克桑塔尔

我认为问题是您在反向传播之前,正向传播之后将渐变归零。请注意,对于自动微分,您需要计算图和在前向传递期间产生的中间结果。

因此,TD误差和目标计算之前将梯度归零而且不是在您完成正向传播之后。

    for cur_step in range(1):   
    action = M_Agent(state, flag)  
    next_state, r = env.step(action)   

    optimizer_M.zero_grad()  # zero your gradient here

    # calculate TD Error
    TD_error = M_Agent.cal_td_error(r, next_state)

    # calculate Target
    target = torch.FloatTensor([M_Agent.cal_target(TD_error)])
    logit = M_Agent.cal_logit()
    loss = criterion(logit, target)

    # update value Func
    TD_error.backward()
    optimizer_M.step()

    # update Actor Func
    loss.backward()
    optimizer_M.step()

为了回答您的第二个问题,例如DDPG算法使用平方误差(请参阅本文)。

另一个建议。在许多情况下,价值和政策网络的大部分都由深层的参与者批评者共享:您具有直到最后一个隐藏层的相同层,并使用单个线性输出进行价值预测,并使用softmax层进行操作分布。如果您有高维度的视觉输入,这特别有用,因为它可以作为多任务学习的一种手段,但是您仍然可以尝试。(如我所见,您有一个低维状态向量)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

RuntimeError:梯度运算所需的变量之一已通过就地操作进行了修改

RuntimeError:梯度运算所需的变量之一是否已被就地操作修改?

遇到RuntimeError:梯度运算所需的变量之一已被就地操作修改

找不到引起“ RuntimeError:梯度计算所需的变量之一已被就地操作修改的变量”的就地操作:

找不到原位运算:原位运算已修改了梯度计算所需的变量之一

微观优化,是否已通过现代浏览器进行了优化?

由就地操作修改的变量之一

当我运行我的网络。我得到一个错误,需要梯度计算的一个变量已经被修改通过就地操作

在Jupyter笔记本中对Python变量进行了修改,尽管对此没有任何进一步的操作

Excel –以升序返回唯一值的数量,已针对100,000多种情况进行了优化

如果我创建一个原子变量,线程之间是否对原子变量进行了所有操作?

是否对克隆语句进行了优化?

针对循环python进行了优化

如何检查我的应用程序是否已针对Android进行了电池优化配置?

Kotlin的Float,Int等是否已针对JVM中的内置类型进行了优化?

苹果是否已删除“针对iPhone 6和iPhone 6 Plus进行了优化”?

C ++中的文件范围变量在gcc和clang中进行了不同的优化

Visual Studio是否针对超线程微处理器进行了优化?

ML系列编译器是否对尾部调用进行了任何复杂的优化?

是否对不使用模板参数的模板化类的方法进行了编译器优化?

Python:我创建了2个列表,我对其中之一进行了排序,并且都对它们进行了排序

为什么gcc使用-O0进行了一些优化

保存具有多个输出的 Keras 模型(包装的字典在包装器之外进行了修改)

进行了错误编辑,如何返回?

如果索引叶变量用于梯度更新,如何解决就地操作错误?

Json到Pandas Dataframe进行了一些修改

JavaScript对象属性以一种非常有趣的方式进行了修改

我已通过liquibase运行.sql文件,对该文件进行了一些更改,现在校验和验证失败

Ubuntu是否针对多核CPU进行了优化?