将状态批次传递到网络时,大小不匹配

时间:2019-11-27 14:31:15

标签: machine-learning neural-network pytorch reinforcement-learning q-learning

由于我是ML的初学者,所以这个问题或整个设计听起来可能很愚蠢,对此感到抱歉。我愿意接受任何建议。

我有一个简单的网络,其中包含三个线性层,其中一个是输出层。

self.fc1 = nn.Linear(in_features=2, out_features=12)
self.fc2 = nn.Linear(in_features=12, out_features=16)
self.out = nn.Linear(in_features=16, out_features=4)

我的状态由两个值组成,坐标x和y。这就是输入层具有两个功能的原因。

在main.py中,我正在采样并提取ReplayMemory类中的内存,并将它们传递给get_current函数:

    experiences = memory.sample(batch_size)
    states, actions, rewards, next_states = qvalues.extract_tensors(experiences)

    current_q_values = qvalues.QValues.get_current(policy_net, states, actions)

由于单个状态由两个值组成,因此状态张量的长度为batchsize x 2,而动作的长度为batchsize。 (也许是问题所在?)

当我在get_current函数中将“状态”传递给我的网络以获取该状态的预测q值时,出现此错误:

大小不匹配,m1:[1x16],m2:[2x12]

看起来它正在尝试获取状态张量,就好像它是单个状态张量一样。我不要在我遵循的教程中,它们传递了状态张量,该张量是多个状态的堆栈,没有问题。我究竟做错了什么? :)

这是我存储体验的方式:

memory.push(dqn.Experience(state, action, next_state, reward))

这是我的提取张量函数:

def extract_tensors(experiences):
    # Convert batch of Experiences to Experience of batches
    batch = dqn.Experience(*zip(*experiences))

    state_batch = torch.cat(tuple(d[0] for d in experiences))
    action_batch = torch.cat(tuple(d[1] for d in experiences))
    reward_batch = torch.cat(tuple(d[2] for d in experiences))
    nextState_batch = torch.cat(tuple(d[3] for d in experiences))

    print(action_batch)

    return (state_batch,action_batch,reward_batch,nextState_batch)

我遵循的教程是该项目的教程。

https://github.com/nevenp/dqn_flappy_bird/blob/master/dqn.py

在第148到169行之间查看。尤其是第169行,它将状态批处理传递到网络。

1 个答案:

答案 0 :(得分:0)

已解决。原来,我不知道如何正确创建2d张量。 2D张量必须是这样的:

状态= torch.tensor([[1,1],[2,2]],dtype = torch.float)