1.actor网络居然是两个分支????
答:
以下面代码为例,与ddpg的actor网络不同,该网络有两个返回值,两个返回值通常用于构建一个正太分布,从而生成动作。
class Actor(nn.Module):
def __init__(self, state_dim, min_log_std=-20, max_log_std=2):
super(Actor, self).__init__()
self.fc1 = nn.Linear(state_dim, 256)
self.fc2 = nn.Linear(256, 256)
self.mu_head = nn.Linear(256, 1)
self.log_std_head = nn.Linear(256, 1)
self.min_log_std = min_log_std
self.max_log_std = max_log_std
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
mu = self.mu_head(x)
log_std_head = F.relu(self.log_std_head(x))
log_std_head = torch.clamp(log_std_head, self.min_log_std, self.max_log_std)
return mu, log_std_head
2.actor网络需要return两个数值:mean和std
答:
使用两个返回值得到具体的动作
import torch
import torch.distributions as D
# 假设 x 是状态输入
mu, log_std = actor(x) # actor 是你的 Actor 实例
# 计算标准差
std = torch.exp(log_std)
# 创建正态分布
dist = D.Normal(mu, std)
3.critc与actor网络之间的对应关系
答:在第一次调试sac代码过程中出现tensor.shape不对应的问题