Pytorch:权重未更新

问题描述 投票:0回答:1

我正在尝试训练模型,但是它不起作用,因为当我调用以下代码时权重没有更新:

self.optimizer = Adam(self.PPO.parameters(), lr=0.1, eps=epsilon)
total_loss = Variable(policy_loss + 0.5*value_loss - entropy_loss.mean() * 0.01, requires_grad=True)

self.optimizer.zero_grad()
(total_loss * 10).backward()
self.optimizer.step()

当我打印权重时,它们都是一样的(损失不为零,学习率设置为0.1),当我比较权重时(甚至在每个参数上调用clone()),它总是返回True。总损失也具有grad_fn属性...优化程序是在我的代理类的构造函数中创建的。

我的代码基于此存储库:https://github.com/andreiliphd/tennis-ppo/blob/master/agent.py

这是我的代理构造函数:

    def __init__(self, PPO, learning_rate, epsilon, discount_rate, entropy_coefficient, ppo_clip, gradient_clip,
                 rollout_length, tau):
        self.PPO = PPO
        self.learning_rate = learning_rate
        self.epsilon = epsilon
        self.discount_rate = discount_rate
        self.entropy_coefficient = entropy_coefficient
        self.ppo_clip = 0.2
        self.gradient_clip = 5
        self.rollout_length = rollout_length
        self.tau = tau
        self.optimizer = Adam(self.PPO.actor.parameters(), lr=0.1, eps=epsilon)
        self.device = torch.device('cpu')

这是我的PPO类,它创建两个具有转发功能的网络和一些隐藏层

class PPO(nn.Module):

    def __init__(self, state_shape, action_num, mlp_layers, device=torch.device('cpu')):
        super(PPO, self).__init__()
        self.state_shape = state_shape
        self.action_num = action_num
        self.mlp_layers = mlp_layers
        self.device = torch.device('cpu')

        layer_dims = [np.prod(self.state_shape)] + self.mlp_layers
        self.actor = PPO_Network(state_shape, action_num, layer_dims, True)
        self.actor = self.actor.to(device)
        self.critic = PPO_Network(state_shape, 1, layer_dims, False)
        self.critic = self.critic.to(device)
        self.to(device)

非常欢迎您说明为什么发生这种情况,以及我忽略的一切。 :)如果需要,我可以提供更多信息或代码。

python pytorch gradient
1个回答
0
投票

我解决了这个问题:)这是非常愚蠢的,这是因为我将网络返回的值之一转换为numpy,然后将其转换回张量。由于一些凌乱的代码,我花了一些时间才意识到。

© www.soinside.com 2019 - 2024. All rights reserved.