DQN, Cartpole 문제 학습 과정에서 그래프 미표시 및 오류 관련 질문

import os
import torch
import torch.nn as nn
import torch.optim as optim
from tensordict import TensorDict
from torchrl.objectives import DQNLoss
from torchrl.envs import GymEnv, TransformedEnv, StepCounter
from torchrl.data import ListStorage, CompositeSpec, TensorDictReplayBuffer
from torchrl.modules import MLP, QValueActor
from matplotlib import pyplot as plt

os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

env = GymEnv("CartPole-v1")
env = TransformedEnv(env)
env.append_transform(StepCounter())

input_shape = env.observation_spec["observation"].shape
env_specs = env.specs
num_outputs = env_specs["input_spec", "full_action_spec", "action"].space.n
action_spec = env_specs["input_spec", "full_action_spec", "action"]

def make_model():
return MLP(
in_features=input_shape[-1],
activation_class=nn.Tanh,
out_features=num_outputs,
num_cells=[120, 84],
)

model = make_model()

actor = QValueActor(
module=model,
spec=CompositeSpec(action=action_spec),
in_keys=["observation"],
)

loss = DQNLoss(
value_network=actor,
delay_value=True
)

optimizer = optim.Adam(params=actor.parameters(), lr=1e-3)

EPOCHS = 1000
UPDATE_TIMES = 3
BATCH_SIZE = 5
MIN_HONORABLE_STEPS = 100

replay_buffer = TensorDictReplayBuffer(storage=ListStorage(10000), batch_size=BATCH_SIZE)
step_counts =
honorable_models =

for i in range(EPOCHS):
state = env.reset()
finished = state["done"]
while not finished.item():
act = actor(state["observation"])
action = TensorDict({"action": act[0], "step_count": state["step_count"]}, batch_size=)
result = env.step(action)
next_state = result["next"]
finished = next_state["done"]
if finished.item():
next_state["reward"] = torch.tensor([-100.0])
result["observation"] = state["observation"]
state = next_state
replay_buffer.add(result)

actor.train()
for _ in range(UPDATE_TIMES):
    samples = replay_buffer.sample()
    loss_t = loss(samples)
    q_loss = loss_t["loss"]
    optimizer.zero_grad()
    q_loss.backward()
    optimizer.step()
step_counts.append(state["step_count"])
print(i, state["step_count"])
if state["step_count"] >= MIN_HONORABLE_STEPS:
    copied_model = QValueActor(make_model(),spec=CompositeSpec(action=action_spec),in_keys=["observation"],)
    copied_model.load_state_dict(actor.state_dict())
    honorable_models.append(copied_model)
if i % 10 == 0:
    UPDATE_TIMES += 1

plt.plot([i for i in range(len(step_counts))], step_counts)
plt.show(block=False)
plt.pause(10)

env = GymEnv("CartPole-v1", render_mode="human")
env = TransformedEnv(env)
env.append_transform(StepCounter())
for act in honorable_models:
state = env.reset()
finished = state["done"]
while not finished.item():
act = actor(state["observation"])
action = TensorDict({"action": act[0], "step_count": state["step_count"]}, batch_size=)
result = env.step(action)
next_state = result["next"]
finished = next_state["done"]
if finished.item():
next_state["reward"] = torch.tensor([-100.0])
result["observation"] = state["observation"]
state = next_state
print(state["step_count"])

오류 메세
C:\Users\MSI\anaconda3\envs\cs_ar\Lib\site-packages\torchrl\envs\common.py:2989: DeprecationWarning: Your wrapper was not given a device. Currently, this value will default to 'cpu'. From v0.5 it will default to None. With a device of None, no device casting is performed and the resulting tensordicts are deviceless. Please set your device accordingly.
warnings.warn(
C:\Users\MSI\anaconda3\envs\cs_ar\Lib\site-packages\pygame\pkgdata.py:25: DeprecationWarning: pkg_resources is deprecated as an API. See Package Discovery and Resource Access using pkg_resources - setuptools 69.5.1.post20240425 documentation
from pkg_resources import resource_stream, resource_exists

학습을 전부다 한다음에 그래프가 출력되지 않고 다음과 같은 오류메세지가 발생하는데 무엇이 문제이며 해결책으로 무엇이 있을까요

  • 아래 답변은 Anthropic의 Claude-3 Opus 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! Cartpole 문제를 DQN으로 학습하는 과정에서 그래프가 표시되지 않고 오류가 발생하는 상황이네요. 먼저 오류 메시지를 살펴보고 해결 방안을 제시해 드리겠습니다.

우선 오류 메시지를 보면 다음과 같은 내용이 있습니다:

  1. torchrl.envs.common 모듈에서 wrapper에 device가 주어지지 않아 DeprecationWarning이 발생했습니다. 향후 버전에서는 device가 None으로 기본 설정되어 device casting이 수행되지 않을 것이라고 합니다. device를 명시적으로 설정하라는 경고입니다.

  2. pygame.pkgdata 모듈에서 pkg_resources 모듈이 deprecated 되었다는 DeprecationWarning이 발생했습니다. 대신 setuptools 문서에서 제안하는 방식을 사용하라는 내용입니다.

이 경고들은 코드 실행에는 큰 영향을 주진 않지만, 그래프가 표시되지 않는 것과는 별개의 문제일 수 있습니다.

그래프가 표시되지 않는 이유는 plt.show(block=False)plt.pause(10) 부분에서 찾을 수 있을 것 같네요. block=False로 설정하면 non-blocking 모드로 동작하여 그래프 창이 바로 닫힐 수 있습니다. 대신 plt.show()만 호출하거나 block=True로 설정하는 것이 좋겠습니다.

또한 plt.pause(10)은 10초 동안 그래프 창을 유지하는 역할을 하지만, 코드 실행이 완료되면 그래프 창이 자동으로 닫히게 됩니다. 그래프 창을 계속 유지하려면 plt.show() 이후에 input() 함수를 호출하여 사용자 입력을 기다리게 하는 방법이 있습니다.

수정된 코드는 다음과 같습니다:

# 그래프 출력 부분 수정
plt.plot([i for i in range(len(step_counts))], step_counts)
plt.show(block=True)
# plt.pause(10)  # 주석 처리 또는 삭제
input("Press Enter to continue...")  # 사용자 입력 대기

이렇게 수정하면 그래프 창이 바로 닫히지 않고 사용자가 Enter 키를 누를 때까지 유지될 것입니다.

참고로 그래프 관련 내용은 Matplotlib 공식 문서를 참조하시면 도움이 될 것 같습니다.

오류 메시지와 관련해서는 torchrl과 pygame 라이브러리의 최신 버전을 사용하면 해당 경고들이 나타나지 않을 수도 있습니다. 필요하다면 라이브러리 버전을 업데이트해 보시는 것도 좋겠네요.

추가적으로 도움이 필요하거나 해결되지 않는 부분이 있다면 언제든 다시 질문해 주세요. 최대한 자세히 안내해 드리도록 하겠습니다. 감사합니다!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4-Turbo 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! DQN을 이용한 Cartpole 문제에 대해 학습 과정 중 그래프가 표시되지 않고 오류 메시지가 발생하는 문제로 고민이 많으셨겠네요. 문제 상황을 정리해보자면, 학습은 정상적으로 진행되지만, 학습 후 그래프를 출력하려 할 때 그래프가 나타나지 않고, 또한 코드 실행 중에 몇 가지 DeprecationWarning이 발생하는 상황으로 보입니다.

먼저, 그래프가 표시되지 않는 문제에 대해 살펴보겠습니다. Matplotlib을 사용할 때 plt.show(block=False)는 비차단 모드로 그래프를 표시하려고 할 때 사용합니다. 그러나 이 설정은 일부 환경에서는 의도대로 작동하지 않을 수 있습니다. 특히 Jupyter Notebook이나 일부 특정 IDE에서는 block=False 설정이 예상대로 작동하지 않을 수 있습니다. 이 경우, 단순히 plt.show()를 사용하여 기본 차단 모드로 그래프를 표시해 보는 것이 좋습니다.

plt.plot([i for i in range(len(step_counts))], step_counts)
plt.show()
# plt.pause(10) # 이 부분은 필요에 따라 주석 처리하거나 제거할 수 있습니다.

다음으로, 발생하는 DeprecationWarning에 대해서는, 이러한 경고들은 대부분 라이브러리의 특정 기능이 향후 버전에서 변경되거나 제거될 예정임을 알리는 것입니다. 예를 들어, torchrlpygame에서 발생하는 경고는 향후 버전에서의 변경 사항에 대비하여 코드를 업데이트하라는 의미입니다. 이러한 경고들은 코드의 실행에는 직접적인 영향을 주지 않지만, 라이브러리를 최신 버전으로 업데이트하거나 공식 문서를 참조하여 변경될 사항을 미리 확인하는 것이 좋습니다.

torchrl의 경우, 공식 문서(Welcome to PyTorch Tutorials — PyTorch Tutorials 2.3.0+cu121 documentation)에서 관련 경고 메시지에 대한 해결 방법을 찾을 수 있을 것입니다. pygame에 대한 경고는 pygame의 공식 문서나 GitHub 저장소에서 관련 정보를 찾아볼 수 있습니다.

마지막으로, 코드의 실행 환경(예: Jupyter Notebook, PyCharm, VSCode 등)에 따라 그래프 표시 방법이나 경고 메시지 처리 방법이 다를 수 있으므로, 사용 중인 환경의 문서를 참조하는 것도 도움이 될 수 있습니다.

제 답변이 정확하지 않을 수도 있으니, 상황이 개선되지 않는다면 추가적인 정보와 함께 다시 질문해 주시면 감사하겠습니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 Google의 Gemini Pro 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요. CartPole 문제를 학습하는 동안 그래프가 표시되지 않고 오류가 발생한다는 문제를 해결하려고 노력하고 계시다니 안타깝습니다. 저는 문제를 이해한 것 같고 도움을 드릴 수 있도록 최선을 다하겠습니다.

  1. 문제 요약

    • PyTorch를 사용하여 CartPole 문제를 학습하는 동안 그래프가 표시되지 않습니다.
    • 학습 과정에서 다음과 같은 오류 메시지가 발생합니다.
      • "C:\Users\MSI\anaconda3\envs\cs_ar\Lib\site-packages\torchrl\envs\common.py:2989: DeprecationWarning: Your wrapper was not given a device. Currently, this value will default to 'cpu'. From v0.5 it will default to None. With a device of None, no device casting is performed and the resulting tensordicts are deviceless. Please set your device accordingly."
      • "C:\Users\MSI\anaconda3\envs\cs_ar\Lib\site-packages\pygame\pkgdata.py:25: DeprecationWarning: pkg_resources is deprecated as an API. See Package Discovery and Resource Access using pkg_resources - setuptools 69.5.1.post20240425 documentation
        "
  2. 해결책

    • 오류 메시지 해결:
      • 첫 번째 오류 메시지는 PyTorch RL 라이브러리의 DeprecationWarning이며 장치 지정이 누락되었음을 나타냅니다. 이를 해결하려면 다음과 같이 장치를 명시적으로 지정하세요.
        env = GymEnv("CartPole-v1", device="cpu") # 또는 "cuda"로 설정
        
      • 두 번째 오류 메시지는 PyGame 라이브러리의 DeprecationWarning이며 여기에서는 무시해도 됩니다.
    • 그래프 표시:
      • 그래프를 표시하려면 다음과 같은 코드를 추가하세요.
        plt.ioff()  # 인터랙티브 모드 비활성화
        plt.show()  # 그래프 창 표시
        
      • 이 코드는 matplotlib이 그래프를 표시하도록 플롯팅을 차단 모드로 설정합니다.
  3. 참고 자료

이러한 해결책이 문제를 해결하는 데 도움이 되기를 바랍니다. 그래도 문제가 해결되지 않으면 자세한 오류 메시지와 코드를 제공해 주시면 추가로 조사해 드리겠습니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! DQN을 이용한 Cartpole 문제에 대한 학습 과정 중 그래프가 표시되지 않고 오류 메시지가 발생하는 문제로 고민이 많으셨겠네요. 질문을 정리해보면, PyTorch와 관련 라이브러리를 사용하여 Cartpole 문제를 해결하기 위한 DQN 모델을 구현하고 학습시키는 과정에서, 학습이 완료된 후 그래프를 출력하려고 할 때 그래프가 나타나지 않고 특정 오류 메시지들이 발생하는 상황입니다.

이 문제를 해결하기 위해 몇 가지 접근 방법을 제안하고자 합니다.

  1. 그래프 미표시 문제: plt.show(block=False)를 사용하셨는데, 이는 그래프를 비동기적으로 표시하려고 할 때 사용합니다. 하지만, 스크립트가 종료되면서 그래프 창도 함께 닫힐 수 있습니다. 이를 해결하기 위해 plt.show()를 단독으로 사용해 보세요. 이 경우, 스크립트가 그래프 창을 닫을 때까지 대기하게 됩니다. 만약 스크립트가 계속 실행되어야 한다면, plt.ion()을 사용하여 대화형 모드를 활성화하고, plt.show() 대신 plt.draw()plt.pause(0.001)을 사용해 업데이트된 그래프를 볼 수 있습니다.

  2. 오류 메시지 해결: 오류 메시지들은 대부분 라이브러리의 특정 기능이 곧 지원 중단될 예정임을 알리는 경고(deprecation warning)입니다. 이러한 경고는 현재 코드의 실행에는 직접적인 영향을 주지 않지만, 미래에 라이브러리를 업데이트할 때 문제가 발생할 수 있음을 의미합니다. 특히, DeprecationWarning에 대해 언급된 부분은 라이브러리의 향후 버전에서 변경될 예정인 부분에 대한 것이므로, 해당 라이브러리의 최신 문서를 확인하여 적절한 변경을 적용하는 것이 좋습니다.

아래는 수정된 그래프 표시 부분의 예시 코드입니다:

import matplotlib.pyplot as plt

# 기존 코드에서 step_counts를 정의하는 부분 수정
step_counts = []

# 학습 루프 내부 코드...

# 학습 후 그래프 표시
plt.plot([i for i in range(len(step_counts))], step_counts)
plt.xlabel('Epoch')
plt.ylabel('Step Count')
plt.title('Training Progress')
plt.show()  # block=False 부분을 제거하고 단독으로 사용

위의 코드는 학습 과정에서의 스텝 수를 그래프로 나타내는 방법을 보여줍니다. plt.show()를 사용하여 그래프가 제대로 표시되도록 합니다.

PyTorch와 관련된 더 자세한 정보나 튜토리얼은 공식 PyTorch 튜토리얼 페이지 https://pytorch.org/tutorials 또는 한국어 버전 https://tutorials.pytorch.kr에서 찾아볼 수 있습니다.

제 답변이 정확하지 않을 수도 있으니, 문제가 계속된다면 추가적인 정보와 함께 질문을 업데이트해 주시기 바랍니다.


  • 이 답변이 도움이 되셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!