>source

저는 pytorch를 처음 사용하고 Reinforcement Learning을 사용하여 시계열에 대한 DQN 작업을 하고 있으며 시계열과 일부 센서 판독값에 대한 복잡한 관찰이 필요했기 때문에 두 개의 신경망을 병합했는데 그것이 무엇인지 확실하지 않습니다. 내 loss.backward 또는 다른 것을 망치고 있습니다. 제목이 같은 질문이 여러 개 있다는 것을 알고 있지만 아무 것도 저에게 효과가 없었습니다. 어쩌면 제가 누락된 것일 수도 있습니다.
우선, 이것은 내 네트워크입니다.

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)

calc_loss라는 함수가 있고 그 끝에서 아래와 같이 MSE 손실을 반환합니다.

print(state_action_values.dtype)
  print(expected_state_action_values.dtype)
  return nn.MSELoss()(state_action_values, expected_state_action_values)

인쇄물은 각각 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()

인쇄 출력은 다음과 같습니다.
토치.float64
텐서(1887.4831, dtype=torch.float64, grad_fn=)

expected_state_action_values를 float로 변환하는 것은 어떻습니까?

joe321402022-01-09 18:27:11

안녕하세요 @joe32140, MSE의 두 입력을 모두 부동으로 캐스트하려고 했지만 동일한 오류가 발생했습니다.

Ramzy2022-01-09 18:27:11

모델과 데이터를 두 배로 통합하려고 할 수도 있습니다. DQN 초기화의 마지막 줄에 self.double()을 추가하여 입력이 이중이라고 가정합니다. 또는 모델에 입력하기 전에 데이터를 부동 상태로 변환합니다.

joe321402022-01-09 18:27:11

Joe에게 감사합니다. 에이전트에 대한 관찰 표현과 관련하여 몇 가지 단점이 있는 모델을 통합하는 방법을 찾고 있습니다. 입력과 관련하여 이미 nans, inf 또는 -inf가 없는 float을 확인했습니다. 그러나 일부가 있을 수 있으며 디버깅할 수 없습니다.

Ramzy2022-01-09 18:27:11
  • 이전 python : 특정 프레임에 대한 파이썬 디버거 중단점
  • 다음 다른 bazel 규칙의 빌드 디렉토리에 있는 파일을 가져오는 방법