Pytorch 演员-评论家模型:如何在模型和动作批次之间调整大小
我是PyTorch和强化学习新手,因此,如果此消息听起来很愚蠢或解决方案太简单,我很抱歉,但我不知道如何解决此问题,我已经花了几天时间 研究这个问题,试图找到解决这个问题的方法,但我做不到。如果你们中有人能帮我做这件事,或者至少给我一些建议,我会非常感激 我试图建立一个模型,在市场上买卖股票,这个模型将有两个可能的动作,分别是买入和卖出。 此外,我正在尝试实现一个演员-评论家模型,为演员使用2个相互关联的GRU模型,为评论家模型只使用一些简单的线性层,因为我试图看看在我的例子中,与正常模型相比,它有多好Pytorch 演员-评论家模型:如何在模型和动作批次之间调整大小,pytorch,reinforcement-learning,tensor,openai-gym,openai,Pytorch,Reinforcement Learning,Tensor,Openai Gym,Openai,我是PyTorch和强化学习新手,因此,如果此消息听起来很愚蠢或解决方案太简单,我很抱歉,但我不知道如何解决此问题,我已经花了几天时间 研究这个问题,试图找到解决这个问题的方法,但我做不到。如果你们中有人能帮我做这件事,或者至少给我一些建议,我会非常感激 我试图建立一个模型,在市场上买卖股票,这个模型将有两个可能的动作,分别是买入和卖出。 此外,我正在尝试实现一个演员-评论家模型,为演员使用2个相互关联的GRU模型,为评论家模型只使用一些简单的线性层,因为我试图看看在我的例子中,与正常模型相比,
class ActorNN(nn.Module):
def __init__(self, stock_env: StockEnv, conf: wandb):
super(ActorNN, self).__init__()
self.stock_env = stock_env
self.input_size = 20
self.hidden_size_1 = 235
self.hidden_size_2 = 135
self.num_layers_1 = 2
self.num_layers_2 = 3
self.batch_size = 350
output_size = self.stock_env.action_space.n # (2 - BUY, SELL)
self.lstm = nn.GRU(input_size=self.input_size, hidden_size=self.hidden_size_1,
num_layers=self.num_layers_1, dropout=conf.dropout_1)
self.lstm_2 = nn.GRU(input_size=self.hidden_size_1, hidden_size=self.hidden_size_2,
num_layers=self.num_layers_2, dropout=conf.dropout_2)
self.output_layer = nn.Linear(self.hidden_size_2, output_size)
self.activation = nn.Tanh()
def forward(self, x):
x = self.activation(x.view(len(x), -1, self.input_size))
out, new_hidden_1 = self.lstm(x)
out = self.activation(new_hidden_1)
out, _ = self.lstm_2(out)
out = self.activation(out)
out = self.output_layer(out)
return out
class CriticNN(nn.Module):
def __init__(self, stock_env: StockEnv):
# stock_env.window_size = 300
super(CriticNN, self).__init__()
self.stock_env = stock_env
self.l1 = nn.Linear(stock_env.window_size * 25, 128)
self.l2 = nn.Linear(128, 256)
self.l3 = nn.Linear(256, 1)
self.activation = nn.ReLU()
def forward(self, x):
output = self.activation(self.l1(torch.flatten(x, start_dim=1)))
output = self.activation(self.l2(output))
output = self.l3(output)
return output
现在我的问题出现在代理的优化函数上
def optimize(self):
if len(self.memory) < self.config.batch_size:
return
state, action, new_state, reward, done = self.memory.sample(batch_size=self.config.batch_size)
state = torch.Tensor(np.array(state)).to(device)
new_state = torch.Tensor(np.array(new_state)).to(device)
reward = torch.Tensor(reward).to(device)
action = torch.LongTensor(action).to(device)
done = torch.Tensor(done).to(device)
dist = torch.distributions.Categorical(self.actor(state))
advantage = reward + (1 - done) * self.config.gamma * self.critic(new_state).squeeze(1) - self.critic(state).squeeze(1)
critic_loss = advantage.pow(2).mean()
self.optimizer_critic.zero_grad()
critic_loss.backward()
self.optimizer_critic.step()
actor_loss = -dist.log_prob(action) * advantage.detach()
self.optimizer_actor.zero_grad()
actor_loss.mean().backward()
self.optimizer_actor.step()
def优化(自我):
如果len(self.memory)
当我尝试初始化我的dist
变量时,它将是形状[3(隐藏层)、300(窗口大小)、2(动作数量)],而我的动作的形状[350(批量大小)]
现在,当我试图运行dist.log\u prob(action)
时,我收到一个错误,上面写着:
张量a(350)的大小必须与张量b(300)在非单态维度1的大小相匹配
这是因为我的距离和动作的形状不一样,我的问题来了,我怎样才能使它们匹配?你们谁能帮我做这个?我试着用
多个线性层匹配它们的大小,但我无法使它们数学化