Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 索引张量的维数必须与使用torch.gather()时遇到的输入张量错误的维数相同_Python_Pytorch - Fatal编程技术网

Python 索引张量的维数必须与使用torch.gather()时遇到的输入张量错误的维数相同

Python 索引张量的维数必须与使用torch.gather()时遇到的输入张量错误的维数相同,python,pytorch,Python,Pytorch,我是PyTorch的新手,在运行我的神经网络时遇到了“索引张量必须与输入张量具有相同的维数”错误。它发生在我调用torch.gather()的一个实例时。有人能帮我理解torch.gather()并解释这个错误的原因吗 以下是发生错误的代码: def learn(batch, optim, net, target_net, gamma, global_step, target_update): my_loss = [] optim.zero_grad()

我是PyTorch的新手,在运行我的神经网络时遇到了“索引张量必须与输入张量具有相同的维数”错误。它发生在我调用torch.gather()的一个实例时。有人能帮我理解torch.gather()并解释这个错误的原因吗

以下是发生错误的代码:

  def learn(batch, optim, net, target_net, gamma, global_step, target_update):
      my_loss = []
      optim.zero_grad()
  
      state, action, next_state, reward, done, next_action = batch
      qval = net(state.float())
  
      loss_a = torch.gather(qval, 3, action.view(-1,1,1,1)).squeeze() #Error happens here!

      loss_b = reward + gamma * torch.max(target_net(next_state.float()).cuda(), dim=3).values * (1 - done.int())
      loss_val = torch.sum(( torch.abs(loss_a-loss_b) ))
      loss_val /= 128
      my_loss.append(loss_val.item())
      loss_val.backward()
      optim.step()
      if global_step % target_update == 0:
          target_network.load_state_dict(q_network.state_dict())
如果有帮助,下面是创建操作来源批次的batch函数:

def sample_batch(memory,batch_size):
    
    indices = np.random.randint(0,len(memory), (batch_size,))

    state = torch.stack([memory[i][0] for i in indices]) 
    action = torch.tensor([memory[i][1] for i in indices], dtype = torch.long)
    next_state = torch.stack([memory[i][2] for i in indices])
    reward = torch.tensor([memory[i][3] for i in indices], dtype = torch.float)
    done = torch.tensor([memory[i][4] for i in indices], dtype = torch.float)
    next_action = torch.tensor([memory[i][5] for i in indices], dtype = torch.long)

    return state,action,next_state,reward,done,next_action
当我打印出“QVAL”、“action”和“action.view(-1,1,1,1)”的不同形状时,这是输出:

qval torch.Size([10, 225])
act view torch.Size([10, 1, 1, 1])
action shape  torch.Size([10])
请解释导致此错误的原因!我想更多地了解代码中发生了什么,以及如何解决问题。谢谢

描述了Torch.gather。如果我们接受你的代码,这一行

torch.gather(qval, 3, action.view(-1,1,1,1))
相当于

act_view = action.view(10,1,1,1)
out = torch.zeros_like(act_view)
for i in range(10):
    for j in range(1):
         for k in range(1):
              for p in range(1):
                   out[i,j,k,p] = qval[i,j,k, act_view[i,j,k,p]]
return out
这显然毫无意义。特别是,
qval
不是4-D,因此不能像这样索引。循环的
数量由输入张量的形状决定,它们都应该具有相同的维数才能工作(顺便说一句,这是您的错误告诉您的)。这里,
qval
是2D,
act\u view
是4D

我不知道你想用这个做什么,但如果你能解释你的目标,并删除你的例子中所有无用的东西(主要是训练和backprop相关的代码),以得到一个最小的可复制的例子,我可以帮助你进一步找到正确的方法:)

描述了Torch.gather。如果我们接受你的代码,这一行

torch.gather(qval, 3, action.view(-1,1,1,1))
相当于

act_view = action.view(10,1,1,1)
out = torch.zeros_like(act_view)
for i in range(10):
    for j in range(1):
         for k in range(1):
              for p in range(1):
                   out[i,j,k,p] = qval[i,j,k, act_view[i,j,k,p]]
return out
这显然毫无意义。特别是,
qval
不是4-D,因此不能像这样索引。
循环的
数量由输入张量的形状决定,它们都应该具有相同的维数才能工作(顺便说一句,这是您的错误告诉您的)。这里,
qval
是2D,
act\u view
是4D

我不知道你想用这个做什么,但如果你能解释你的目标,并删除你的例子中所有无用的东西(主要是训练和backprop相关的代码),以得到一个最小的可复制的例子,我可以帮助你进一步找到正确的方法:)