运行时错误:找到 dtype Double 但预期为 Float - PyTorch

Ram*_*mzy 1 python reinforcement-learning python-3.x pytorch

我是 pytorch 的新手,我正在使用强化学习对时间序列进行 DQN 工作,我需要对时间序列和一些传感器读数进行复杂的观察,所以我合并了两个神经网络,我不确定这是否会破坏我的损失.向后或其他什么。我知道有多个具有相同标题的问题,但没有一个对我有用,也许我错过了一些东西。
首先,这是我的网络:

class DQN(nn.Module):
  def __init__(self, list_shape, score_shape, n_actions):
    super(DQN, self).__init__()

    self.FeatureList =  nn.Sequential(
            nn.Conv1d(list_shape[1], 32, kernel_size=8, stride=4),
            nn.ReLU(),
            nn.Conv1d(32, 64, kernel_size=4, stride=2),
            nn.ReLU(),
            nn.Conv1d(64, 64, kernel_size=3, stride=1),
            nn.ReLU(),
            nn.Flatten()
        )
    
    self.FeatureScore = nn.Sequential(
            nn.Linear(score_shape[1], 512),
            nn.ReLU(),
            nn.Linear(512, 128)
        )
    
    t_list_test = torch.zeros(list_shape)
    t_score_test = torch.zeros(score_shape)
    merge_shape = self.FeatureList(t_list_test).shape[1] + self.FeatureScore(t_score_test).shape[1]
    
    self.FinalNN =  nn.Sequential(
            nn.Linear(merge_shape, 512),
            nn.ReLU(),
            nn.Linear(512, 128),
            nn.ReLU(),
            nn.Linear(128, n_actions),
    )
    
  def forward(self, list, score):
    listOut = self.FeatureList(list)
    scoreOut = self.FeatureScore(score)
    MergedTensor = torch.cat((listOut,scoreOut),1)
    return self.FinalNN(MergedTensor)
Run Code Online (Sandbox Code Playgroud)

我有一个名为 calc_loss 的函数,最后它返回 MSE 损失,如下所示

  print(state_action_values.dtype)
  print(expected_state_action_values.dtype) 
  return nn.MSELoss()(state_action_values, expected_state_action_values)
Run Code Online (Sandbox Code Playgroud)

打印结果分别显示 float32 和 float64。
当我运行 loss.backward() 时出现错误,如下所示

LEARNING_RATE = 0.01
optimizer = optim.Adam(net.parameters(), lr=LEARNING_RATE)

for i in range(50):
  optimizer.zero_grad()
  loss_v = calc_loss(sample(obs, 500, 200, 64), net, tgt_net)
  print(loss_v.dtype)
  print(loss_v)
  loss_v.backward()
  optimizer.step()
Run Code Online (Sandbox Code Playgroud)

打印输出如下:
torch.float64
tensor(1887.4831, dtype=torch.float64, grad_fn=)

更新 1:
我尝试使用更简单的模型,但同样的问题,当我尝试将输入转换为 Float 时,出现错误:

RuntimeError: expected scalar type Double but found Float
Run Code Online (Sandbox Code Playgroud)

是什么让模型的预期加倍?

更新 2:
我尝试在火炬导入后在顶部添加以下行,但存在同样的问题RuntimeError: Found dtype Double but expected Float

>>> torch.set_default_tensor_type(torch.FloatTensor)
Run Code Online (Sandbox Code Playgroud)

但是当我使用 DoubleTensor 时,我得到: RuntimeError: Input type (torch.FloatTensor) and weight type (torch.DoubleTensor) should be the same or input should be a MKLDNN tensor and weight is a dense tensor

Ram*_*mzy 7

问题不在于网络的输入,而在于 MSELoss 的标准,因此将标准转换为浮动后效果良好,如下所示

return nn.MSELoss()(state_action_values.float(), expected_state_action_values.float())
Run Code Online (Sandbox Code Playgroud)

我决定把答案留给像我这样的初学者,他们可能会被卡住并且没有想到要检查损失标准的数据类型