day day up~ 2023-04-03 15:06 采纳率: 80%
浏览 24

DDPG输出的多维动作向量值在0附近

最近在用DDPG算法解决路径规划问题,但是不知道为什么actor网络输出的多维动作向量值总是在0附近大概都是1e-3数量级,而且每个step的变化都不大,导致转换后的动作(比如移动方向、速度、发射功率等)都很小
actor网络的loss值打出来是有在变化的,网络参数也是有变化的,神经网络的输入也得提前调到了同一数量级(1-10),BN层和LN层都尝试加过了,真的调试了好久,也还是不知道到底是哪里出了问题,神经网络模型长这样(加了LN层的),希望有小伙伴可以告诉我还有可能是哪里的问题啊


```python
[array([ 0.00363818,  0.0018692 ,  0.00566376, -0.00982124, -0.01358668],
      dtype=float32), array([ 0.00291705,  0.00226895,  0.00478148, -0.00890055, -0.01326749],
      dtype=float32), array([ 0.01321111, -0.00697791,  0.0161714 , -0.01741296, -0.02361217],
      dtype=float32)]
[array([ 0.00532129,  0.00018366,  0.00718524, -0.01139973, -0.01506326],
      dtype=float32), array([ 0.0043016 ,  0.00165614,  0.00569433, -0.0099882 , -0.01458266],
      dtype=float32), array([ 0.01287621, -0.00733752,  0.01562952, -0.01715881, -0.02311403],
      dtype=float32)]
[array([ 0.00528781,  0.00021858,  0.00714553, -0.01137979, -0.01502699],
      dtype=float32), array([ 0.00429485,  0.00165806,  0.00569154, -0.00998067, -0.01457683],
      dtype=float32), array([ 0.01285914, -0.00732083,  0.01560804, -0.01715397, -0.02309367],
      dtype=float32)]
[array([ 0.00401041,  0.00186404,  0.00624963, -0.00991879, -0.01420762],
      dtype=float32), array([ 0.00283949,  0.00227825,  0.00515016, -0.00914116, -0.01310303],
      dtype=float32), array([ 0.01349892, -0.0071977 ,  0.01686332, -0.01759761, -0.02409484],
      dtype=float32)]
[array([ 0.00400529,  0.00187367,  0.00623996, -0.00991626, -0.01420152],
      dtype=float32), array([ 0.00282853,  0.0022863 ,  0.00514006, -0.00913269, -0.0130916 ],
      dtype=float32), array([ 0.01344847, -0.00715144,  0.01680301, -0.01756832, -0.02403875],
      dtype=float32)]



```python

class MLPNetwork(nn.Module):
    """
    MLP network (can be used as value or policy)
    """
    def __init__(self, input_dim, out_dim, hidden_dim1=128, hidden_dim2=64, nonlin=F.relu,
                 constrain_out=False, norm_in=False, discrete_action=True):
        """
        Inputs:
            input_dim (int): Number of dimensions in input
            out_dim (int): Number of dimensions in output
            hidden_dim (int): Number of hidden dimensions
            nonlin (PyTorch function): Nonlinearity to apply to hidden layers
        """
        super(MLPNetwork, self).__init__()

        if norm_in:  # normalize inputs
            self.in_fn = nn.BatchNorm1d(input_dim)  # 批归一化
            self.in_fn.weight.data.fill_(1)
            self.in_fn.bias.data.fill_(0)
        else:
            self.in_fn = lambda x: x

        # 层归一化
        self.fc1 = nn.Linear(input_dim, hidden_dim1)
        self.ln1 = nn.LayerNorm(hidden_dim1)
        self.fc2 = nn.Linear(hidden_dim1, hidden_dim2)
        self.ln2 = nn.LayerNorm(hidden_dim2)
        self.fc3 = nn.Linear(hidden_dim2, out_dim)

        self.nonlin = nonlin

        if constrain_out and not discrete_action:
            # initialize small to prevent saturation
            self.fc3.weight.data.uniform_(-3e-3, 3e-3)
            self.fc3.bias.data.uniform_(-3e-3, 3e-3)
            self.out_fn = torch.tanh
        else:  # logits for discrete action (will softmax later)
            self.out_fn = lambda x: x

    def forward(self, X):
        """
        Inputs:
            X (PyTorch Matrix): Batch of observations
        Outputs:
            out (PyTorch Matrix): Output of network (actions, values, etc)
        """

        h1 = self.nonlin(self.ln1(self.fc1(self.in_fn(X))))
        h2 = self.nonlin(self.ln2(self.fc2(h1)))
        out = self.out_fn(self.fc3(h2))

        return out
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-04 03:08
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/734740
    • 这篇博客你也可以参考下:原语,中断、异常和系统调用的关系,中断的分类,系统调用和过程调用,常见系统调用
    • 除此之外, 这篇博客: 【并发编程】--- 并发编程中的可见性、原子性、有序性问题中的 3.2 有序性问题产生的原因 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      其实通过分析已经可以知道,之所以出现3.1中的问题,就是因为代码出现了重排序问题,为什么代码会进行重排序呢?

      通过下图可以看到,重排序后可以明显减少代码的指令 — 》 指令减少了,速度也就快了
      也就是说重排序可以提高代码的处理速度
      在这里插入图片描述
      其实我们写的代码到最终的执行指令,一般会涉及到三种重排序:

      • (1) 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序;
      • (2)指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-LevelParallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
      • (3)内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行的。

      在这里插入图片描述
      这时候,我想你一定像我刚知道这些时一样疑惑:
      (1)我平时写代码没感觉到它进行过重排序啊;
      (2)多线程情况下,如果每个线程都可能会发生重排序问题,那为了能写出按照我们的意愿执行的代码,那我们写代码时得考虑多少问题啊。。。

      但是实际上以我们的开发经验来说,我们并不需要考虑这么多,这是为什么呢???
      其实很简单,就是JMM规定了一些不可进行重新排序的规则,对此我们或许并不知道,但其实已经受益于这些规则了 —> 即happens-before规则 —> 抽空再好好对happens-before整理一下。



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 4月4日
  • 创建了问题 4月3日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题