-
카테고리
-
세부 분야
딥러닝 · 머신러닝
-
해결 여부
미해결
episode중간에 weight나 모델을 저장하고싶습니다.
22.02.28 22:22 작성 조회수 635
0
답변을 작성해보세요.
0
멀티코어
지식공유자2022.03.05
안녕하세요 김유석님.
다양한 해결방법이 있겠지만, 간단하게 다음과 같이 오류처리를 하시면 됩니다.
감사합니다.
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
멀티코어
지식공유자2022.03.01
안녕하세요 김유석님
학습 시간이 길어질 경우 중간에 가중치 저장하는 방법을 많이 사용합니다.
본 강의에서는 가중치를 저장하고 로딩하는 부분이 빠져있는데, 다른 수강생들에게 도움될만한 질문을 올려주셔서 감사합니다. 일반적으로 모델 학습이 가중치를 찾아내는 것이기 때문에 중간에 모델을 저장하기 보다는 가중치를 저장해서 다음에 학습할 때 로딩해서 사용하는 방법을 활용합니다.
다음 함수를 프로그램에 추가하시고, 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 함수를 실행시키는 것을 잘못한것같은데, 어디 부분이 잘못되었는지 알려주실수 있으실까요?
멀티코어
지식공유자2022.03.02
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를 저장하는 확장자를 추가해야할까요?
답변 2