묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
학습 관련
안녕하세요, 수업 따라가면서 코드 오류는 없었지만 내용에 질문이 생겨 글 남기게 되었습니다. 드론 agent 스크립트 중 Heuristic()에서 키보드 입력을 주었을 때 OnActionReceived()로 전달되어 드론을 움직이는 것으로 이해했는데, 학습 과정에서는 키보드 입력 없이 드론이 어떤 방법으로 스스로 움직이며 학습을 하는 것인지 궁금합니다. 감사합니다!
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
알고리즘 관련
안녕하세요, 알고리즘 관련해서 질문드리고 싶어 글 남깁니다. 해당 드론 예제를 DDPG가 아닌 PPO로 학습할 경우 대체로 성능이 낮아질까요? 내장된 알고리즘이 아닌 DDPG를 선택해 사용하신 이유가 궁금합니다.또한 드론과 goal 사이에 여러 장애물이 무작위로 배치될 경우에도 해당 알고리즘으로 학습이 무리없이 진행될지 질문드리고 싶습니다. 강화학습에 입문하면서 도움 많이 받고 있습니다. 감사합니다!
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
API를 통한 학습 관련
안녕하세요, mlagents-learn을 이용해 학습하고 적용하는 것까지는 무리 없이 수강하였는데, API를 이용해 학습하는 과정에서 질문이 생겨 문의 드립니다. (현재 아나콘다에서 실습 진행하고 있습니다.) 학습 알고리즘으로 PPO가 아닌 DQN을 사용하고자 한다면 강의와 같이 코드를 작성하여 저장하고, 저장한 경로에서 해당 파이썬 파일을 실행하면 학습이 진행되는 것이 맞을까요? 기타 다른 작업이 필요하지는 않은지 궁금합니다.예를 들어, mlagents-learn을 사용해 학습을 할 때에 사용했던 yaml 파일 등을 따로 생성할 필요는 없는지 등에 대해 여쭙고싶습니다. 감사합니다!
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
ml-agents 관련 질문 있습니다.
안녕하세요, 저는 강화 학습 관련 관심이 생겨 여러 강화 학습 관련 프로젝트를 진행하고 있는 대학교 4학년 학생입니다. 인프런 강의를 기반으로 하여 프로젝트 진행에 도움을 많이 받고 있어 너무 감사합니다.다름이 아니라 ml-agents 관련 질문이 있어 글을 쓰게 되었습니다.강화 학습에서 reward shaping하는 기준 혹은 참고 논문이 있는 건지 궁금합니다.Training을 진행할 때 여러 번 경험한 내용으로 시간이 지나는데도 학습이 진행이 안된 경험이 있습니다. 이럴 때마다 작업 관리자로 CPU나 CUDA의 이용률을 보면 0프로 정도로 거의 움직이지 않는데 이를 병목 현상으로 예상하고 있습니다. 이를 해결하기 위해 아나콘다 프롬폼트에 키보드 interrupt를 하게 되면 멈췄던 학습이 실행 되어 여러 번 interrupt를 걸어 해결했습니다. 여러 다른 컴퓨터를 사용할 때마다 일어나는 공통적인 현상이라 혹시 제가 학습을 잘못 하고 있는 건지 아니면 이러한 현상에 대한 해결 방안이 따로 있는 건지 궁금합니다. 강화 학습 Training 방법을 찾아보면 제가 보기로는 두 가지 방법이 있었습니다. Unity 환경에서 하나의 프리팹 위에서 episode가 끝날 때마다 Agent나 environment의 구성을 랜덤으로 하여 진행하는 방식과 다른 environment를 여러개의 프리팹으로 하여 학습을 진행하는 방법이 있었습니다. 두 방법에 큰 차이가 있는 건지 궁금합니다.항상 이해하기 쉽게 강화 학습 관련 강의를 해주셔서 다시 한번 감사드립니다.
-
미해결모두를 위한 딥러닝 - 기본적인 머신러닝과 딥러닝 강좌
tf.placeholder 에러
placeholder란 method가 없다고 하는데 업그레이드하면서 없어진건가요? 없어졌다면 뭐로 대체해서 사용하면 될까요?
-
미해결프로그래머를 위한 강화학습(저자 직강)
cartpole_reinforce.ipynb 에러
코랩에서 cartpole_reinforce.ipynb 실행시킬때 아래와 같은 에러 발생합니다.ValueError: Layer "my_model_1" expects 3 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 1, 4) dtype=float32>]에러나는 소스 위치는 아래 화면에서 "y_pred = self(states, training=True)" 부분에서 에러가 발생됩니다. class MyModel(tf.keras.Model): def train_step(self, data): in_datas, out_actions = data states, action_matrix, rewards = in_datas[0], in_datas[1], in_datas[2] with tf.GradientTape() as tape: y_pred = self(states, training=True) action_probs = K.sum(action_matrix*y_pred, axis=-1) loss = -K.log(action_probs)*rewards trainable_vars = self.trainable_variables gradients = tape.gradient(loss, trainable_vars) self.optimizer.apply_gradients(zip(gradients, trainable_vars)) tensorflow 버젼 : 2.9.2 이며, 모델에 3개의 값을 주어야 하는데, 1개만 받아서 그런것 같습니다.해결 방법 알려 주시기 바랍니다.감사합니다.
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
A2C 알고리즘을 드론 환경에 적용하려면
안녕하세요, 드론 환경에서 A2C 알고리즘을 적용해서 실험해보려고 합니다.환경에 맞게 적용을 하기 위해 state_size, action_size를 각각 9와 3으로 설정하고, 이 외에도 여러 부분을 수정하여 돌려 보려고 했는데 잘 안 되네요.get_action() 함수를 손보거나, preprocess를 하는 부분을 수정해주어야 할 것 같은데, 어떻게 해결해야 할지 잘 모르겠습니다.현재 상태에서는 다음과 같은 오류가 발생하고 있습니다.A2C.py의 코드는 아래와 같습니다.import numpy as np import datetime import platform import torch import torch.nn.functional as F from torch.utils.tensorboard import SummaryWriter from collections import deque from mlagents_envs.environment import UnityEnvironment, ActionTuple from mlagents_envs.side_channel.engine_configuration_channel\ import EngineConfigurationChannel # A2C를 위한 파라미터 값 세팅 state_size = 9 action_size = 3 load_model = False train_mode = True discount_factor = 0.9 learning_rate = 0.00025 run_step = 100000 if train_mode else 0 test_step = 10000 print_interval = 10 save_interval = 100 # VISUAL_OBS = 0 # GOAL_OBS = 1 # VECTOR_OBS = 2 # OBS = VECTOR_OBS # 유니티 환경 경로 game = "Drone" os_name = platform.system() if os_name == 'Windows': env_name = f"C:/Users/user/anaconda3/envs/mlagents/Drone_0427/Drone_1002_3.exe" elif os_name == 'Darwin': env_name = f"../envs/{game}_{os_name}" # 모델 저장 및 불러오기 경로 date_time = datetime.datetime.now().strftime("%Y%m%d%H%M%S") save_path = f"./saved_models/{game}/A2C/{date_time}" load_path = f"./saved_models/{game}/A2C/20210709235643" # 연산 장치 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print("CUDA is available" if torch.cuda.is_available() else "CPU is available") # A2C 클래스 -> Actor Network / Critic Network 정의 class A2C(torch.nn.Module): def __init__(self, **kwargs): super(A2C, self).__init__(**kwargs) self.d1 = torch.nn.Linear(state_size, 128) self.d2 = torch.nn.Linear(128, 128) self.pi = torch.nn.Linear(128, action_size) self.v = torch.nn.Linear(128, 1) def forward(self, x): x = F.relu(self.d1(x)) x = F.relu(self.d2(x)) return F.softmax(self.pi(x), dim=1), self.v(x) # A2CAgent 클래스 -> A2C 알고리즘을 위한 다양한 함수 정의 class A2CAgent(): def __init__(self): self.a2c = A2C().to(device) self.optimizer = torch.optim.Adam(self.a2c.parameters(), lr=learning_rate) self.writer = SummaryWriter(save_path) if load_model == True: print(f"... Load Model from {load_path}/ckpt ...") checkpoint = torch.load(load_path+'/ckpt', map_location=device) self.a2c.load_state_dict(checkpoint["network"]) self.optimizer.load_state_dict(checkpoint["optimizer"]) # 정책을 통해 행동 결정 def get_action(self, state, training=True): # 네트워크 모드 설정 self.a2c.train(training) #네트워크 연산에 따라 행동 결정 pi, _ = self.a2c(torch.FloatTensor(state).to(device)) action = torch.multinomial(pi, num_samples=1).cpu().numpy() return action def train_model(self, state, action, reward, next_state, done): state, action, reward, next_state, done = map(lambda x: torch.FloatTensor(x).to(device), [state, action, reward, next_state, done]) pi, value = self.a2c(state) # Value network with torch.no_grad(): _, next_value = self.a2c(next_state) target_value = reward + (1-done) * discount_factor * next_value critic_loss = F.mse_loss(target_value, value) #Policy network eye = torch.eye(action_size).to(device) one_hot_action = eye[action.view(-1).long()] advantage = (target_value - value).detach() actor_loss = -(torch.log((one_hot_action * pi).sum(1))*advantage).mean() total_loss = critic_loss + actor_loss self.optimizer.zero_grad() total_loss.backward() self.optimizer.step() return actor_loss.item(), critic_loss.item() # 네트워크 모델 저장 def save_model(self): print(f"... Save Model to {save_path}/ckpt ...") torch.save({ "network" : self.a2c.state_dict(), "optimizer" : self.optimizer.state_dict(), }, save_path+'/ckpt') # 학습 기록 def write_summray(self, score, actor_loss, critic_loss, step): self.writer.add_scalar("run/score", score, step) self.writer.add_scalar("model/actor_loss", actor_loss, step) self.writer.add_scalar("model/critic_loss", critic_loss, step) # Main 함수 -> 전체적으로 A2C 알고리즘을 진행 if __name__ == '__main__': # 유니티 환경 경로 설정 (file_name) engine_configuration_channel = EngineConfigurationChannel() env = UnityEnvironment(file_name=env_name, side_channels=[engine_configuration_channel]) env.reset() # 유니티 브레인 설정 behavior_name = list(env.behavior_specs.keys())[0] spec = env.behavior_specs[behavior_name] engine_configuration_channel.set_configuration_parameters(time_scale=12.0) dec, term = env.get_steps(behavior_name) # A2C 클래스를 agent로 정의 agent = A2CAgent() actor_losses, critic_losses, scores, episode, score = [], [], [], 0, 0 for step in range(run_step + test_step): if step == run_step: if train_mode: agent.save_model() print("TEST START") train_mode = False engine_configuration_channel.set_configuration_parameters(time_scale=1.0) #preprocess = lambda obs, goal: np.concatenate((obs*goal[0][0], obs*goal[0][1]), axis=-1) #state = preprocess(dec.obs[OBS]) #state = preprocess(dec.obs[OBS],dec.obs[GOAL_OBS]) state = dec.obs[0] action = agent.get_action(state, train_mode) action_tuple = ActionTuple() action_tuple.add_continuous(action) env.set_actions(behavior_name, action_tuple) env.step() dec, term = env.get_steps(behavior_name) done = len(term.agent_id) > 0 reward = term.reward if done else dec.reward next_state = term.obs[0] if done else dec.obs[0] score += reward[0] if train_mode: agent.append_sample(state[0], action[0], reward, next_state[0], [done]) # 학습 수행 actor_loss, critic_loss = agent.train_model() actor_losses.append(actor_loss) critic_losses.append(critic_loss) if done: episode += 1 scores.append(score) score = 0 # 게임 진행 상황 출력 및 텐서 보드에 보상과 손실함수 값 기록 if episode % print_interval == 0: mean_score = np.mean(scores) mean_actor_loss = np.mean(actor_losses) mean_critic_loss = np.mean(critic_losses) agent.write_summray(mean_score, mean_actor_loss, mean_critic_loss, step) actor_losses, critic_losses, scores = [], [], [] print(f"{episode} Episode / Step: {step} / Score: {mean_score:.2f} / " +\ f"Actor loss: {mean_actor_loss:.2f} / Critic loss: {mean_critic_loss:.4f}") # 네트워크 모델 저장 if train_mode and episode % save_interval == 0: agent.save_model() env.close()답변 주시면 감사하겠습니다!
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
목표물이 움직이는 상태에서의 학습
안녕하세요, 드론 오브젝트를 통해 학습하는 부분에서, 목표물이 등속(드론보다는 느리게) 이동하는 것을 가정하여 코드를 작성하려고 합니다. 이 경우, DroneSetting.cs 부분에만 코드를 부분적으로 수정해서 작성할 수 있을까요? 아니면 어떤 부분의 수정이 추가적으로 필요할까요?
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
스크립트 작성
이거 스크립트 다 따라서 작성해야 하나요 아니면 따로 다운받을 수 있는 곳이 있나요? 영상 보면서 다 따라서 작성해봤는데... 안될꺼라 생각했는데 역시 안되네요. 주피터에서 작성했고 코드를 몇번 더 컴토했는데 잘 안되네요.. 일단 경로 설정부터 이해가 잘 안가네요. 6분15초에 나오는 ckpt 파일이랑 events 파일은 어떻게해서 만들어진건가요? save_path 랑 load_path 를 지정해야하는데 어떤걸 입력해야 하는지 잘 모르겠습니다. 처음부터 끝까지 실행해서 트론시물레이션이 작동되는 영상은 혹시 없는가요?..
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
CS0246 DroneSetting 오류
안녕하세요, 강의 잘 수강하고 있습니다. 드론 에셋을 가져와서 스크립트를 작성하는 과정에 있는데, 아래와 같은 오류가 발생하여 질문드립니다. CS0246: The type or namespace name 'DroneSetting' could not be found 에러가 발생했는데, 어떻게 해결할 수 있을까요? Unity 버전은 2021.2.16f1 을 사용하고 있으며, ML Agents는 2.0.0-exp.1, ML Agents Extensions는 0.4.0-preview 버전입니다. 코드는 아래와 같습니다. using UnityEngine; using Unity.MLAgents; using Unity.MLAgents.Actuators; using Unity.MLAgents.Sensors; using PA_DronePack; public class DroneAgent : Agent { public PA_DroneController dcoScript; public DroneSetting area; public GameObject goal; float preDist; private Transform agentTrans; private Transform goalTrans; private Rigidbody agent_Rigidbody; public override void Initialize() { base.Initialize(); dcoScript = gameObject.Getcomponent<PA_DroneController>(); agentTrans = gameObject.transform; goalTrans = goal.transform; agent_Rigidbody = gameObject.GetComponent<agent_Rigidbody>(); Academy.Instance.AgentPreStep += WaitTimeInterference; } public override void CollectObservations(VectorSensor sensor) { //거리벡터 sensor.AddObservation(agentTrans.position - goalTrans.position); //속도벡터 sensor.AddObservation(agent_Rigidbody.velocity); //각속도벡터 sensor.AddObservation(agent_Rigidbody.angularVelocity); } public override void OnActionReceived(ActionBuffers actionBuffers) { AddReward(-0.01f); var actions = actionBuffers.ContinuousActions; float moveX = Mathf.Clamp(actions[0], -1, 1f); float moveY = Mathf.Clamp(actions[1], -1, 1f); float moveZ = Mathf.Clamp(actions[2], -1, 1f); dcoScript.DriveInput(moveX); dcoScript.StrafeInput(moveY); dcoScript.LiftInput(moveZ); float distance = Vector3.Magnitude(goalTrans.position - agentTrans.position); if(distance <=0.5f) { SetReward(1f); EndEpisode(); } else if(distance >10f) { SetReward(-1f); EndEpisode(); } else { floar reward = preDist - distance; AddReward(reward); preDist = distance; } } public override void OnEpisodeBegin() { area.AreaSetting(); preDist = Vector3.Magnitude(goalTrans.position - agentTrans.position); } public override void Heuristic(in ActionBuffers actionsOut) { var continuousActionsOut = actionsOut.ContinuousActions; continuousActionsOut[0] = Input.GetAxis("Vertical"); continuousActionsOut[1] = Input.GetAxis("Horizontal"); continuousActionsOut[2] = Input.GetAxis("Mouse ScrollWheel"); } public float DecisionWaitingTime = 5f; float m_currentTime = 0f; public void WaitTimeInterference(int action) { if(Academy.Instance.IsCommunicatorOn) { RequestDecision(); } else { if(m_currentTime >=DecisionWaitingTime) { m_currentTime = 0f; RequestDecision(); } else { m_currentTime += m_currentTime.fixedDeltaTime; } } } } 아울러, 드론 에셋 가져오기 & 오브젝트 추가 강의에서, PA_Drone Axis Input과 PA_Drone Controller도 체크를 할 수 없게 되면서, "The associated script can not be loaded. Please fix any compile erroes and open Prefab Mode and assign a valid script to the Prefab Asset" 이라는 문구가 나오는데, 이 문제는 어떻게 해결할 수 있을지 질문드립니다. 두 오류가 연관이 있을 수도 있겠습니다. 확인해 주시면 감사하겠습니다
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
강의 첫 리뷰 : 열심히 공부하겠습니다.
안녕하세요 대표 강사님인 규식님을 비롯한 여러분의 선생님들을 이렇게 강좌로 볼 수 있다니 너무 반갑습니다. 유튜브 등에서 목소리를 자주 들어서 그런지 내적 친밀감이 느껴집니다. 개인적으로 저는 텐서플로로 배우는 유니티MLAgents 강화학습 교재를 구매하여 독학을 하고 있었습니다.*절판된 책을 어렵게 구했습니다. 하지만 2년여의 시간이 흐르면서 그 사이에 유니티 최신버전이 나오기도하였고 저는 맥북을 이용하고 있어서 독학으로 따라가기에는 부담이 있다고 생각하고 있던 찰나에 이 강좌를 발견하였습니다. 좋은 강의 앞으로 열심히 듣고 많이 배우겠습니다, 감사합니다.