사용자 도구

사이트 도구


example:ppg

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

다음 판
이전 판
example:ppg [2020/10/19 13:56] – 만듦 rex8312example:ppg [2024/03/23 02:42] (현재) – 바깥 편집 127.0.0.1
줄 78: 줄 78:
             module.weight.data.fill_(1.0)             module.weight.data.fill_(1.0)
  
-    def forward(self, x, aux=False): +    def forward(self, x): 
-        if aux: +        = self.vf(x) 
-            x = self.shared(x) +        logit = self.policy(self.shared(x)
-            logit = self.policy(x) +        return v, F.log_softmax(logit, -1), F.softmax(logit, -1)             
-            return self.aux(x), F.log_softmax(logit, -1), F.softmax(logit, -1) +         
-        else+    def aux_forward(self, x)
-            v = self.vf(x) +        v = self.vf(x) 
-            logit = self.policy(self.shared(x)) +        = self.shared(x) 
-            return v, F.log_softmax(logit, -1), F.softmax(logit, -1)            +        aux_v = self.aux(x) 
 +        logit = self.policy(x
 +        return v, aux_v, F.log_softmax(logit, -1), F.softmax(logit, -1)
  
  
줄 106: 줄 108:
     model_old = Model(n_features, n_actions)     model_old = Model(n_features, n_actions)
     model_old.load_state_dict(model.state_dict())     model_old.load_state_dict(model.state_dict())
-    optimizer = optim.Adam(model.parameters(), lr=args.lr, weight_decay=args.weight_decay)+    pol_optimizer = optim.Adam(model.parameters(), lr=args.lr, weight_decay=args.weight_decay) 
 +    aux_optimizer = optim.Adam(model.parameters(), lr=args.lr, weight_decay=args.weight_decay)
  
     # 테스트 게임 시작     # 테스트 게임 시작
줄 212: 줄 215:
             # 미니배치 준비             # 미니배치 준비
             sel = idx[mb_i * args.mini_batch_size: (mb_i+1) * args.mini_batch_size]             sel = idx[mb_i * args.mini_batch_size: (mb_i+1) * args.mini_batch_size]
-            obs = torch.from_numpy(FD_obs[sel]).float() +            obs = torch.tensor(FD_obs[sel], device=args.device).float() 
-            action = torch.from_numpy(FD_action[sel]).long() +            action = torch.tensor(FD_action[sel], device=args.device).long() 
-            ret = torch.from_numpy(FD_ret[sel]).float() +            ret = torch.tensor(FD_ret[sel], device=args.device).float() 
-            adv = torch.from_numpy(FD_adv[sel]).float() +            adv = torch.tensor(FD_adv[sel], device=args.device).float() 
-            logp_old = torch.from_numpy(FD_logp[sel]).float()+            logp_old = torch.tensor(FD_logp[sel], device=args.device).float()
  
             # 그래프 생성             # 그래프 생성
줄 224: 줄 227:
  
             # loss_v             # loss_v
-            ## loss_v = 0.5 * (ret - value.view(ret.shape)).pow(2).mean() +            # loss_v = 0.5 * (ret - value.view(ret.shape)).pow(2).mean() 
-            loss_v = F.smooth_l1_loss(value, ret.view(value.shape))+            loss_v = F.smooth_l1_loss(value, ret.view(value.shape)) 
 +            loss_v = F.mse_loss(value, ret.view(value.shape))
             # loss_pi             # loss_pi
             ratios = torch.exp(logp_a - logp_old_a)             ratios = torch.exp(logp_a - logp_old_a)
줄 236: 줄 240:
             loss = loss_v * args.value_coef + loss_pi - args.ent_coef * entropy             loss = loss_v * args.value_coef + loss_pi - args.ent_coef * entropy
  
-            optimizer.zero_grad()+            pol_optimizer.zero_grad()
             loss.backward()             loss.backward()
             torch.nn.utils.clip_grad_norm_(model.parameters(), args.max_grad)             torch.nn.utils.clip_grad_norm_(model.parameters(), args.max_grad)
-            optimizer.step()+            pol_optimizer.step()
  
         # target 모델 교체         # target 모델 교체
줄 249: 줄 253:
             mb_j = mb_i % n_mini_batchs             mb_j = mb_i % n_mini_batchs
             sel = idx[mb_j * args.mini_batch_size: (mb_j+1) * args.mini_batch_size]             sel = idx[mb_j * args.mini_batch_size: (mb_j+1) * args.mini_batch_size]
-            obs = torch.from_numpy(FD_obs[sel]).float() +            obs = torch.tensor(FD_obs[sel], device=args.device).float() 
-            ret = torch.from_numpy(FD_ret[sel]).float()+            ret = torch.tensor(FD_ret[sel], device=args.device).float()
             with torch.no_grad():             with torch.no_grad():
-                _, logp_old, = model_old(obs)+                _, logp_old, prob_old = model_old(obs)
  
             # 그래프 생성             # 그래프 생성
-            value, logp, prob = model(obs, aux=True)+            value, aux_value, logp, prob = model.aux_forward(obs)
  
 +            # loss_v
 +            # loss_v = F.smooth_l1_loss(value, ret.view(value.shape))
 +            loss_v = F.mse_loss(value, ret.view(value.shape))
             # loss_aux_v             # loss_aux_v
-            loss_aux_v = F.smooth_l1_loss(value, ret.view(value.shape))+            loss_aux_v = F.smooth_l1_loss(aux_value, ret.view(value.shape)) 
 +            loss_aux_v = F.mse_loss(aux_value, ret.view(value.shape))
             # loss_kld             # loss_kld
-            kld = (logp_old.exp() * (logp_old - logp) - logp_old.exp() logp.exp()).sum(1).mean()+            kld = (prob_old * (logp_old - logp) - prob_old prob).sum(1).mean()
             loss = loss_aux_v + args.clone_coef * kld             loss = loss_aux_v + args.clone_coef * kld
  
-            optimizer.zero_grad()+            aux_optimizer.zero_grad()
             loss.backward()             loss.backward()
             torch.nn.utils.clip_grad_norm_(model.parameters(), args.max_grad)             torch.nn.utils.clip_grad_norm_(model.parameters(), args.max_grad)
-            optimizer.step()  +            aux_optimizer.step()   
 +         
 +        # target 모델 교체 
 +        model_old.load_state_dict(model.state_dict())
  
         # 학습결과 출력         # 학습결과 출력
example/ppg.1603115786.txt.gz · 마지막으로 수정됨: 2024/03/23 02:38 (바깥 편집)