• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

episode중간에 weight나 모델을 저장하고싶습니다.

22.02.28 22:22 작성 조회수 635

0

안녕하십니까 수강생입니다.
 
지난번 질문에 대해 답변해주셔서 정말 감사합니다. 또 매우 많은 도움이 되었습니다.
 
하루 하루 강의를 들으며 발전해나가고 있어 매우 뿌듯함을 느끼고 있습니다.
 
선생님께 감사의 말씀을 드립니다.
 
이번에 질문드리게 된 내용은, episode가 500번 정도인 경우에는 잠깐 기다리면 곧 끝나는 양입니다.
 
가끔씩 episode가 많은면 1000번 혹은 2000번까지 진행하고 있는데요,
 
500번 인경우에는 부족하고 한 번에 2000번의 episode를 진행하니, 1500번 정도에서 더 이상 reward가 높아지지 않고
 
정체되는 경우가 가끔 있었습니다.
 
이 경우에는 2000번을 다하고 model.save를 하기까지 기다리기가 매우 번거로웠습니다.
 
중간에 episode가 100번마다 model을 save하고자 합니다.
 
if (episdoe % 100) ==0:
 
이런 식으로 Class Agent(object) 내 def train(self)에 코드를 짜 넣어보려고 했습니다. 아직까지 해결 방법이 잘 떠오르지가 않고있습니다ㅠ
 
혹시 중간 중간 모델을 세이브할 tf.keras.callback.Modelcheckpoint와 비슷한 코드를 알 수 있을까요?
 
보통의 일반적 딥러닝 모델은 epoch마다 업데이트하며 저장한다는 것은 알고있었습니다.
 
하지만 강화학습의 경우에는 다른 방법이 필요할것같다는 생각에 질문하게 되었습니다.
 
감사합니다.

답변 2

·

답변을 작성해보세요.

0

안녕하세요 김유석님.

다양한 해결방법이 있겠지만, 간단하게 다음과 같이 오류처리를 하시면 됩니다.

감사합니다.

def load_weight(self):

 print("*****load weight")

 try:

  self.model_actor.load_weights("./model/ppo/actor_weight")

  self.model_critic.load_weights("./model/ppo/critic_weight")

 except:

  print("no load data")

0

안녕하세요 김유석님

학습 시간이 길어질 경우 중간에 가중치 저장하는 방법을 많이 사용합니다.

본 강의에서는 가중치를 저장하고 로딩하는 부분이 빠져있는데, 다른 수강생들에게 도움될만한 질문을 올려주셔서 감사합니다. 일반적으로 모델 학습이 가중치를 찾아내는 것이기 때문에 중간에 모델을 저장하기 보다는 가중치를 저장해서 다음에 학습할 때 로딩해서 사용하는 방법을 활용합니다.

다음 함수를 프로그램에 추가하시고, if (episdoe % 100) ==0: 조건문 아래에서 스텝별로 저장하시면 됩니다.  load_weight 함수는 init 함수에 넣어주시면 될 것 같네요.

감사합니다.

#단계별 모델 저장

def save_model_step(self):

self.model_actor.save("./model/ppo/actor_model")

self.model_critic.save("./model/ppo/critic_model")

#단계별 가중치 저장        

def save_weight_step(self):

self.model_actor.save_weights("./model/ppo/actor_weight")

self.model_critic.save_weights("./model/ppo/critic_weight")

#가중치 로딩

def load_weight(self):

print("*****load weight")

self.model_actor.load_weights("./model/ppo/actor_weight")

self.model_critic.load_weights("./model/ppo/critic_weight")

김유석님의 프로필

김유석

질문자

2022.03.01

답변해주셔서 감사합니다!

말씀해주신것 처럼 __init__함수 내에 self.load_weight()으로 저장된 weight로 불러내는 코드를 집어 넣었습니다.

class Agent(object):

    def __init__(self):

        self.env = cylinderEnv()

        self.state_size = self.env.observation_space.shape[0]

        self.action_size = self.env.action_space.n

        self.value_size=1

        

        self.node_num = 24

        self.learning_rate = 0.001

        self.epochs_cnt = 5               

        self.model = self.build_model() 

        

        self.load_weight() #weight 불러오기

        

        self.discount_rate = 0.97

        self.penalty = -100

....

....

....

그리고 __init__ 함수 바로 아래에

 

def save_weight_step(self):

self.model_actor.save_weights("./model/ppo/actor_weight")

self.model_critic.save_weights("./model/ppo/critic_weight")

 

def load_weight(self):

print("*****load weight")

self.model_actor.load_weights("./model/ppo/actor_weight")

self.model_critic.load_weights("./model/ppo/critic_weight")

 

save_weight_step함수와 load_weight함수를 정의를 해주었습니다. 또한 train 진행 시에, episode 100회 마다 weight를 저장하기 위해 train함수에서 10회마다 avg값을 내보내는 코드 아래에

if (episode%100 ==0):

     self.save_weight_step()

라는 코드를 작성해 함수를 실행시켰습니다.

 

따라서 아래의 코드처럼 작성해보았습니다.

 

    def train(self):

        for episode in range(self.episode_num):

 

            state = self.env.reset()

            self.env.max_episode_steps = 500

 

            count, reward_tot = self.make_memory(episode, state)

            self.train_mini_batch()

            self.clear_memory()

            

            if count < 500:

                reward_tot = reward_tot-self.penalty

                

            self.reward_list.append(reward_tot)

            self.count_list.append(count)

            self.moving_avg_list.append(self.moving_avg(self.count_list,self.moving_avg_size))                

                

            if(episode % 10 == 0):

                print("episode:{}, moving_avg:{}, rewards_avg:{}".format(episode, self.moving_avg_list[-1], np.mean(self.reward_list)))

            

            if(episode %100 == 0):

                self.save_weight_step() #weight 저장하기

            

        self.save_model()

 

 

 

이렇게 하고 강화학습을 진행한 결과 아래와 같은 오류코드가 나왔습니다.

(제가 만든 Env 화경의 이름이 cylinderEnv입니다.)

 

 

AttributeError                            Traceback (most recent call last)

C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_1272\3844952034.py in <module>

    164 

    165 if __name__ == "__main__":

--> 166     agent = Agent()

    167     agent.train()

 

C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_1272\3844952034.py in __init__(self)

      1 class Agent(object):

      2     def __init__(self):

----> 3         self.env = cylinderEnv()

      4         self.state_size = self.env.observation_space.shape[0]

      5         self.action_size = self.env.action_space.n

 

C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_1272\3732948012.py in __init__(self)

     13         # over the C.G -> terminate the episode

     14         self.steps_beyond_done = None

---> 15         self.load_weight()

     16 

     17     def step(self, action):

 

 

AttributeError: 'cylinderEnv' object has no attribute 'load_weight'

 

 

 

아무래도 제가 함수정의를 잘못된 위치에 하거나, init 함수 내에 load_weight 함수를 실행시키는 것을 잘못한것같은데, 어디 부분이 잘못되었는지 알려주실수 있으실까요?

load_weight 함수 선언을 Agent클래스 내부에 하시고 함수 호출을 cylinderEnv 객체를 선언하고 있는 클래스의 init 함수에서 하신것 같습니다. Agent 클래스 init 함수 안에서 load_weight 함수를 호출하도록 하시면 문제가 해결될 것 같네요.

감사합니다.

김유석님의 프로필

김유석

질문자

2022.03.02

제가 Env class에서도 load_weight을 호출해버려서 오류가 났었네요, 알려주셔서 감사합니다!

 

현재 다시 ppo 강화학습으로 코드를 실행해본 결과

 

다음과 같은 오류가 발생했습니다.

 

---------------------------------------------------------------------------

RuntimeError                              Traceback (most recent call last)

~\anaconda3\envs\1234\lib\site-packages\tensorflow\python\training\py_checkpoint_reader.py in NewCheckpointReader(filepattern)

     94   try:

---> 95     return CheckpointReader(compat.as_bytes(filepattern))

     96   # TODO(b/143319754): Remove the RuntimeError casting logic once we resolve the

 

RuntimeError: Unsuccessful TensorSliceReader constructor: Failed to find any matching files for ./model/ppo/actor_weight

 

During handling of the above exception, another exception occurred:

 

NotFoundError                             Traceback (most recent call last)

C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_31732\2197922545.py in <module>

    205 

    206 if __name__ == "__main__":

--> 207     agent = Agent()

    208     agent.train()

 

C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_31732\2197922545.py in __init__(self)

     14         self.model_critic = self.build_model_critic()

     15 

---> 16         self.load_weight() # weight 불러오기

     17 

     18         self.discount_rate = 0.98

 

C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_31732\2197922545.py in load_weight(self)

     55 

     56     def load_weight(self):

---> 57         self.model_actor.load_weights("./model/ppo/actor_weight")

     58         self.model_critic.load_weights("./model/ppo/critic_weight")

     59 

 

~\anaconda3\envs\1234\lib\site-packages\tensorflow\python\keras\engine\training.py in load_weights(self, filepath, by_name, skip_mismatch)

    248         raise ValueError('Load weights is not yet supported with TPUStrategy '

    249                          'with steps_per_run greater than 1.')

--> 250     return super(Model, self).load_weights(filepath, by_name, skip_mismatch)

    251 

    252   def compile(self,

 

~\anaconda3\envs\1234\lib\site-packages\tensorflow\python\keras\engine\network.py in load_weights(self, filepath, by_name, skip_mismatch)

   1229     else:

   1230       try:

-> 1231         py_checkpoint_reader.NewCheckpointReader(filepath)

   1232         save_format = 'tf'

   1233       except errors_impl.DataLossError:

 

~\anaconda3\envs\1234\lib\site-packages\tensorflow\python\training\py_checkpoint_reader.py in NewCheckpointReader(filepattern)

     97   # issue with throwing python exceptions from C++.

     98   except RuntimeError as e:

---> 99     error_translator(e)

 

~\anaconda3\envs\1234\lib\site-packages\tensorflow\python\training\py_checkpoint_reader.py in error_translator(e)

     33       'Failed to find any '

     34       'matching files for') in error_message:

---> 35     raise errors_impl.NotFoundError(None, None, error_message)

     36   elif 'Sliced checkpoints are not supported' in error_message or (

     37       'Data type '

 

NotFoundError: Unsuccessful TensorSliceReader constructor: Failed to find any matching files for ./model/ppo/actor_weight

 

 

 

 

./model/ppo 까지의 경로는 존재합니다. actor_weight라는 경로가 아직 생성되지 않아 발생하는 문제인것 같은데, actor_weight이라는 폴더를 생성해할까요? 아니면 weight를 저장하는 확장자를 추가해야할까요?