묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨강화학습 입문에서 Deep Q-learning/Policy Gradient까지
강의 36강에서의 질문
안녕하세요! 이번에 금융권 핀테크 기업으로 이직하면서 강화학습을 직무에 활용할 수 있을까하여 공부하고 있는 사람입니다. import gymnasium as gym import numpy as np import pprint # SFFF (S: 시작점, 안전) # FHFH (F: 얼어있는 표면, 안전) # FFFH (H: 구멍, 추락) # HFFG (G: 목표, 프리스비 위치) # LEFT = 0 # DOWN = 1 # RIGHT = 2 # UP = 3 map = "4x4" SLIPPERY = False # 결정론적 환경 #SLIPPERY = True # 확률적 환경 # FrozenLake-v1 환경을 생성합니다. # desc: None이면 기본 맵을 사용합니다. # map_name: 사용할 맵의 이름을 지정합니다. # is_slippery: True이면 미끄러운 표면(확률적 환경)을 사용하고, False이면 결정론적 환경을 사용합니다. env = gym.make('FrozenLake-v1', desc=None, map_name=map, is_slippery=SLIPPERY) GAMMA = 1.0 # 감가율 (discount factor), 미래 보상의 현재 가치 THETA = 1e-5 # 정책 평가의 종료 조건, 변화가 이 값보다 작으면 평가 종료 num_states = env.observation_space.n # 환경의 상태(state) 개수 num_actions = env.action_space.n # 환경에서 가능한 행동(action) 개수 transitions = env.P # 상태-행동 전이 확률 (state-action transition probabilities)s) 강의로는 36강, 자료로는 015_DP_frozenlake_policy_evaluation.py 상에서 질문이 있습니다. 여기서 THETA가 1E-5인데, 이는 정책 평가의 종료 조건이라고 되어있었습니다. 이 때, 모든 그리드에서의 변화량 중 단 하나의 값이라도 THETA보다 작아지면 평가가 종료되는 것인지, 모든 그리드의 변화량이 THETA보다 작아지면 평가가 종료되는 것인지 궁금합니다.
-
해결됨강화학습 입문에서 Deep Q-learning/Policy Gradient까지
Pytorch 설치 GPU 버전으로 다운해도 되나요?
현재 제 컴퓨터에 RTX 4060 GPU가 있는 상태인데 Pytorch 다운로드를 CPU 버전 말고 GPU 버전으로 다운로드 해도 괜찮을까요? 수업을 듣는데 다른 지장이 있을까요 혹시?
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
DQN 실행 오류
아래와 같이 에러가 발생하는데 원인을 못찾겠습니다. 도움 좀 부탁드립니다. github에 있는 DQN.py를 실행하였습니다. 10 Episode / Step: 152 / Score: -0.34 / Loss: nan / Epsilon: 1.000020 Episode / Step: 332 / Score: -0.57 / Loss: nan / Epsilon: 1.000030 Episode / Step: 455 / Score: -0.51 / Loss: nan / Epsilon: 1.000040 Episode / Step: 754 / Score: 0.01 / Loss: nan / Epsilon: 1.000050 Episode / Step: 1010 / Score: 0.15 / Loss: nan / Epsilon: 1.000060 Episode / Step: 1169 / Score: 0.25 / Loss: nan / Epsilon: 1.000070 Episode / Step: 1376 / Score: 0.20 / Loss: nan / Epsilon: 1.000080 Episode / Step: 1616 / Score: -0.33 / Loss: nan / Epsilon: 1.000090 Episode / Step: 1863 / Score: -0.04 / Loss: nan / Epsilon: 1.0000100 Episode / Step: 2091 / Score: -0.02 / Loss: nan / Epsilon: 1.0000... Save Model to ./saved_models/GridWorld/DQN/20240821214516/ckpt ...110 Episode / Step: 2316 / Score: -0.12 / Loss: nan / Epsilon: 1.0000120 Episode / Step: 2568 / Score: -0.34 / Loss: nan / Epsilon: 1.0000130 Episode / Step: 2755 / Score: -0.78 / Loss: nan / Epsilon: 1.0000140 Episode / Step: 2910 / Score: 0.06 / Loss: nan / Epsilon: 1.0000150 Episode / Step: 3190 / Score: -0.27 / Loss: nan / Epsilon: 1.0000160 Episode / Step: 3484 / Score: -0.48 / Loss: nan / Epsilon: 1.0000170 Episode / Step: 3752 / Score: -0.56 / Loss: nan / Epsilon: 1.0000180 Episode / Step: 3920 / Score: -0.76 / Loss: nan / Epsilon: 1.0000190 Episode / Step: 4142 / Score: 0.19 / Loss: nan / Epsilon: 1.0000200 Episode / Step: 4467 / Score: -0.42 / Loss: nan / Epsilon: 1.0000... Save Model to ./saved_models/GridWorld/DQN/20240821214516/ckpt ...210 Episode / Step: 4771 / Score: -0.30 / Loss: nan / Epsilon: 1.0000Traceback (most recent call last): File "/Users/neweins/Projects/project_unity/ml-agents/build/GridWorld/ref.py", line 224, in <module> loss = agent.train_model() File "/Users/neweins/Projects/project_unity/ml-agents/build/GridWorld/ref.py", line 141, in train_model q = (self.network(state) * one_hot_action).sum(1, keepdims=True) File "/opt/homebrew/Caskroom/miniforge/base/envs/mlagents/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1553, in wrappedcall_impl return self._call_impl(*args, **kwargs) File "/opt/homebrew/Caskroom/miniforge/base/envs/mlagents/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1562, in callimpl return forward_call(*args, **kwargs) File "/Users/neweins/Projects/project_unity/ml-agents/build/GridWorld/ref.py", line 83, in forward x = F.relu(self.conv1(x)) File "/opt/homebrew/Caskroom/miniforge/base/envs/mlagents/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1553, in wrappedcall_impl return self._call_impl(*args, **kwargs) File "/opt/homebrew/Caskroom/miniforge/base/envs/mlagents/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1562, in callimpl return forward_call(*args, **kwargs) File "/opt/homebrew/Caskroom/miniforge/base/envs/mlagents/lib/python3.10/site-packages/torch/nn/modules/conv.py", line 458, in forward return self._conv_forward(input, self.weight, self.bias) File "/opt/homebrew/Caskroom/miniforge/base/envs/mlagents/lib/python3.10/site-packages/torch/nn/modules/conv.py", line 454, in convforward return F.conv2d(input, weight, bias, self.stride,RuntimeError: Given groups=1, weight of size [32, 6, 8, 8], expected input[32, 168, 3, 64] to have 6 channels, but got 168 channels instead
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
ML-Agents 살펴보기 11페이지 질문입니다.
inference Device 타입이 default, GPU, Burst, CPU 4가지로 말씀주셨습니다. 제가 공부하는 PC환경은 mac인데 default, computer shader, burst, pixel shader로 타입이 보입니다. 왜 차이가 나는지와각 타입의 의미를 알 수 있을까요?
-
해결됨강화학습 입문에서 Deep Q-learning/Policy Gradient까지
정책 반복 알고리즘 구현 에서 정책 업데이트 메모리 문제
선생님 #3. 정책 개선 #policy_stable <- true policy_stable = True old_pi = pi #각 s에 대해: for s in range(num_states): # pi_s <- argmax_a(sum(p(s',r|s,a)*[r + gamma*V(s')])) new_action_values = np.zeros(num_actions) for a in range(num_actions): for prob, s_, r, _ in transitions[s][a]: new_action_values[a] += prob * (r + GAMMA * V[s_]) new_action = np.argmax(new_action_values) pi[s] = np.eye(num_actions)[new_action] if old_pi.all() != pi.all(): policy_stable = False여기 최적 정책을 업데이트 하는 과정을 디버깅 하는 과정에서 old.pi = pi 에서 메모리를 공유 해서 pi[s]를 업데이트를 같이 해서 무조건 아래서 if old_pi.all() != pi.all():구문은 True가 나오게 되어 있는데 의도한 바는 old_pi = copy.deepcopy(pi) 로 코드를 바꾸는게 맞나요?
-
해결됨강화학습 입문에서 Deep Q-learning/Policy Gradient까지
반복 정책 평가 실습 알고리즘에서 이론과 코드가 헷갈려서요.
이렇게 기존의 V 테이블을 가지고 새로운 V` 을 구하는데 while True: #delta <- 0 delta = 0 #각 s에 대해 반복: for s in range(num_states): #v <- V(s) old_value = V[s] new_value = 0 #업데이트 규칙 : V(s) = sum(pi(a|s)*sum(p(s,a)*[r + gamma*v(s')])) for a, prob_action in enumerate(policy[s]): # s', r에 대해 합산 for prob, s_, reward, _ in transitions[s][a]: new_value += prob_action * prob * (reward + GAMMA * V[s_]) V[s] = new_value #delta <- max(delta|v - V(s)|) delta = max(delta, np.abs(old_value - V[s]))V[s] = new_value여기 실습 코드에서는 바로 V[s]을 업데이트 합니다.예를 들면9번 타일 상태 값에서 오른쪽 action을 해서 10번의 다음 상태 값을 가지고 계산 합니다.그리고 9번이 상태 값이 업데이트 됩니다.그리고 나서 10번에서 왼쪽의 action의 상태 값을 구할때 이미 업데이트된 9번의 상태 값을 가지고 상태를 업데이트 합니다. 기존 ppt 에서 설명은 기존의 V를 가지고 있다가 기존의 V를 업데이트 하지 않은 채로새로운 V` 테이블을 계산 하고 V 을 V` 로 교체 하는것으로 표현 되고 있습니다. https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_dp.html 해당 사이트의 코드는ppt 에서 배운 대로 V를 V` 로 교체 하는것으로 되어 있습니다. 실습 처럼 바로 값을 업데이트 하는게 맞는건지 ppt 처럼 스왑 하는게 맞는건지어느것이 맞는건지 잘모르겠습니다.
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
배웠던 내용을 기반으로 match3 인공지능으로 플레이 하는 걸 만들고 있는데.. 질문이 있습니다.
match3 게임을 agent가 플레이 하게 하려는 목적으로 시작 했습니다. 과거 match3 게임 개발해 논게 있어서 AbstractBoard 못쓰고 agent 학습 작업을 하였습니다.mlagent Release 21 버젼을 사용했습니다.먼저 퍼즐판은 8*7이고 블럭은 5색깔을 사용한다고 정의 했습니다.public class Match3MLAgentsBoard : Agent 클레스를 정의 하고유니티 mlagnet match3 샘플을 참고해서 8*7 퍼즐판을 색깔별로 있으면 1 없으면 0을 넣는 소스 입니다.public override void CollectObservations(VectorSensor sensor) { MapBoardData mapBoardData = gameMain.IngameData.CurBoardData; MapData mapData = gameMain.IngameData.MapData; int oneHotSize = 5; for (int y = 0; y < mapData.BoardColumns; y++) { for (int x = 0; x < mapData.BoardRows; x++) { SlotTile slotTile = mapBoardData.GetSlotTile(x, y); var type = slotTile.ColorBlock.BlockColorType; for (var i = 0; i < oneHotSize; i++) { sensor.AddObservation((i == (int)type) ? 1.0f : 0.0f); } } } }유니티 mlagnet match3 샘플을 참고해서 agent가 받는 소스를 만들었습니다.public override void OnActionReceived(ActionBuffers actionBuffers) { int aiIndex = actionBuffers.DiscreteActions[0]; MapBoardData mapBoardData = gameMain.IngameData.CurBoardData; var touchSlotIndex = (SharedInt)gameMain.behavior.GetVariable("touchSlotIndex"); var targetSlotIndex = (SharedInt)gameMain.behavior.GetVariable("targetSlotIndex"); int BoardRows = gameMain.IngameData.MapData.BoardRows; int BoardColumns = gameMain.IngameData.MapData.BoardColumns; int row, col; if (aiIndex < (BoardColumns - 1) * BoardRows) { col = aiIndex % (BoardColumns - 1); row = aiIndex / (BoardColumns - 1); int _Index = GetIndex(col, row); touchSlotIndex.SetValue(_Index); int _tarIndex = GetIndex(col + 1, row); targetSlotIndex.SetValue(_tarIndex); } else { var offset = aiIndex - (BoardColumns - 1) * BoardRows; col = offset % BoardColumns; row = offset / BoardColumns; int _Index = GetIndex(col, row); touchSlotIndex.SetValue(_Index); int _tarIndex = GetIndex(col, row + 1); targetSlotIndex.SetValue(_tarIndex); } Debug.Log("###OnActionReceived - end"); }보상은 매칭되는 블럭이 수 만큼 보상을 주도록 했습니다. 3개 매칭 되면 0.3점 4개가 매칭 되면 0.4점 이런식으로요. match3MLAgentsBoard = gameObject.GetComponent<Match3MLAgentsBoard>(); foreach (DamageObject damageObject in gameMain.IngameData.DamageList) { foreach (var baseObject in damageObject.BaseObjectBlocks) { gameMain.IngameData.mReward += 0.1f; rewardSum += 0.1f; } } match3MLAgentsBoard.AddReward(rewardSum); Behavior Paremeters 세팅 입니다.8*7*5=2808*(7-1) +7*(8-1) =97 해서 나온 값을 넣어 줬습니다.(유니티 셈플 계산법) mlagents-learn "C:\Users\TT\Desktop\ml-agents-release_21\config\ppo\Match3.yaml" --env=C:\MyProject\MatchPuzzle\Client\trunk\MatchPuzzle\run\MatchPuzzle.exe --run-id=InGameMain --force --no-graphics하고 나니 이렇게 나오고 학습이 안되었습니다..그래서 mlagent match3 샘플을 보니.Match3SensorComponentMatch3ActuatorComponent있다는걸 찾았고Match3SensorComponent에 Write(ObservationWriter writer) 부분과 Match3ActuatorComponent의 OnActionReceived(ActionBuffers actions)부분을 흉내 내어 Component을 만들고Match3MLAgentsBoard CollectObservations 함수와 OnActionReceived함수는 주석을 쳤습니다.그리고 실행mlagents-learn "C:\Users\TT\Desktop\ml-agents-release_21\config\ppo\Match3.yaml" --env=C:\MyProject\MatchPuzzle\Client\trunk\MatchPuzzle\run\MatchPuzzle.exe --run-id=PuzzleMatch3Sencor --force --no-graphics 여전히 학습이 안되여서.. 유니티 mlagent가 제공하는 match3 샘플을 돌려 보기로 했습니다. mlagents-learn "C:\Users\TT\Desktop\ml-agents-release_21\config\ppo\Match3.yaml" --env=C:\Users\yree1\Desktop\ml-agents-release_21\Project\Match3Run\UnityEnvironment.exe --run-id=UnityMatch3Data --force --no-graphics 샘플도 딱히 학습이 된다고 보기 어려워서.. 혹시 너무 짧아서 학습이 제대로 안되었다고 생각되어 더 길게 학습을 하였습니다. 여전히 학습이 제대로 안되는거 같아서 mlagnet 셋팅 환경이 문제일지 몰라서 3dball 프로젝트를 돌려 봤습니다.mlagents-learn "C:\Users\TT\Desktop\ml-agents-release_21\config\ppo\3DBall.yaml" --env=C:\Users\yree1\Desktop\ml-agents-release_21\Project\3DBallRun\UnityEnvironment.exe --run-id=3DBallData --force --no-graphics 엄청 학습이 잘됩니다. 3dball만 잘 학습 됩니다..혹시나 싶어서 Release 20에서도 학습을 진행 했지만.. 결과는 똑같이 제대로 학습 되지 않았습니다. 제일 궁금한건 왜 match3 agent가 잘 학습을 못하는지 굼금합니다..제가 만든건 왜 학습이 안되는지..궁금 하지만 더 궁금한건.. 유니티에서 제공하는 match3은 문제가 없을텐데.. 제가 뭔가 명령어 옵션이나.. 등등을 놓친게 있을까요?? 정말 아무것도 손 안되고 Release 21압축 풀고 바로 돌린건데요. 그 외에 몇까지 궁금한게 있습니다.학습을 시키면 어느Step까지 기다리고 학습을 평가 해야 되는지..아까보여 드렸든 match3 보상 값은 올라 갔다 내려갔다 계속 값이 왔다 갔다만 있습니다.. 이걸 계속 기다리다보면 언젠가 학습을 잘하게 되는지..값이 계속 왔다 갔다 거리면 그만 해야 되는지..학습이 실패 했다고 정확하게 아는 방법이 있나요? 유니티 mlagent가 제공하는 match3은 왜 Agent을 상속 받아 CollectObservations,OnActionReceived함수를 정의 안하고.. Match3SensorComponent,Match3ActuatorComponent 만들어서 학습을 진행 했는지 궁금합니다. match3 센서값 엑터값을 위에 적은 방법이 아닌 다른 방식으로 많이 셋팅 해봤습니다. 그러나 제대로 학습 되는 경우가 없었습니다.. 인공지능 ppo 알고리즘이 제대로 된 결과값을 얻을 수 있는 팁이나 약간의 규칙(이렇게 하면 조금 잘된다..) 이런게 있을까요?Match3.yaml 파일만 유일하게 learning_rate_schedule: constant을 쓰고 있습니다. 나머지 파일은 전부 learning_rate_schedule: linear 쓰고 있습니다. constant,linear 차이가 뭔가요?? constant을 linear 로 바꾸고 학습 했지만.. 결과는 여전히 학습 되지 않았습니다.파이썬으로 ppo 구현해서 유니티랑 연동하면 왜 학습을 잘 못하는지.. 어떻게 하면 잘 할수 있는지.. 등등이 도움이 될만한 것들이 있을까요? 기존 유니티가 제공하는 ppo를 쓰지 않고 python으로 제작해서 작업 하면 어떤 이득이 있을까요?match3 게임 말고 다른 게임에 mlagent를 적용하고 싶은데요.. match3 같은 색깔 블럭이면 게속 연결 가능한 게임 입니다. 프렌츠타워 라는게 임이 가장 유명합니다. 사진첨부 합니다.위에 게임처럼 연결 할 수 있는 블럭이 3개 ,4개 5개일수도 8*7이라면 56개 일수도 있는 상황은 Behavior Paremeters 세팅은 어떻게 하나요? 8*7퍼즐판이라면 discrete branches 56이되고 Branch 0~Branch 55까지 다 55값을 넣어서는 학습이 잘 안됩다.. 이걸 어떻게 해야 될지.. 전혀 몰르겠습니다. 긴글 읽어주셔서 감사합니다.. 수업 내용과 직접적인 관련이 없는 내용을 질문해서 죄송합니다. 하지만 여기 말고는 물어볼 곳이 없어서.. 이렇게 글 남기게 되었습니다. 감사합니다.
-
미해결만들면서 배우는 인공지능(강화학습 편)
RLKKit실행안됩니다(급하게해결요청드려요)
Anaconda설치하고 RLKit 아래 입력하면 아래처럼 에러 뜹니다. 급하게 해결 연락 부탁드립니다 tjnettt@gmail.com 010-9128-6990 (base) c:\RLkit>python index.pyTraceback (most recent call last): File "c:\RLkit\index.py", line 1, in <module> from flask import render_template, request, jsonify File "C:\Users\tjnet\anaconda3\Lib\site-packages\flask\__init__.py", line 19, in <module> from jinja2 import Markup, escapeImportError: cannot import name 'Markup' from 'jinja2' (C:\Users\tjnet\anaconda3\Lib\site-packages\jinja2\__init__.py)
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
3DBall 학습 중 문제
이런 식으로 잘 실행이 되었는데 이 이후에 이런 문제가 떠버리네요 환경 문제라고 나오는 거 같은데 전혀 모르겠습니다,,
-
해결됨유니티 머신러닝 에이전트 완전정복 (기초편)
mlagents-learn --hlep
학습 하기 전 mlagents-learn --hlep를 실행했는데 이런 문제가 생기네요,, 혹시 어떤 문제일지 알 수 있을까요?
-
해결됨게임기획자를 위한 강화학습 : AI 마리오 에이전트 키우기
마코프 결정 과정(MDP)의 이해 파트가 없어요~
제목에 해당하는 강의를 재생했을경우 이전파트인 강화학습의 기본 원리와 용어/기호 랑 동일한 강의가 재생됩니다~
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
DQN 환경 학습
DQN 환경 학습에서 conv1 레이어로 들어가는 인풋이 [32,168,3,64] 사이즈로 들어가서 에러가 나는 상황입니다. state size를 확인해보니 84가 아닌 168이 계속 인풋으로 들어오는데, 유니티 환경이 잘못된 것일까요?
-
해결됨유니티 머신러닝 에이전트 완전정복 (응용편)
(PPO 실습 2) total_loss 구하는 코드에서 action entropy 는 어떻게 계산된 것인지 궁금합니다.
우선 좋은 수업 감사드립니다. PPO 알고리즘 수업에서 PPO Actor-Critic Network 의 전체 손실 값은 clipped surrogate objective - c1 * value loss (critic loss) + c2 * action entropy 라고 배웠는데, 관련 부분에 대한 코드를 보면 actor_loss = -torch.min(surr1, surr2).mean() critic_loss = F.mse_loss(value, _ret).mean() total_loss = actor_loss + critic_loss로 action entropy 에 대한 연산은 없는 것 같아 보입니다. 혹시 제가 잘못 알고 있거나, 다른 부분에서 이미 고려된 것이라면, 알려주시길 부탁 드립니다. 아니면 고려하지 않아도 되는 조건이라면 어떤 이유가 있는지 알고 싶습니다. 감사합니다.
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
DQN 함수를 어디에다 만들고 실행하나요??>?>
코드 설명과 실제 구동화면을 같이 보여주면 따라하기 편할거 같은데요..실제로 어떻게 구동하는지 나오지 않으니 따라가기 힘드네요
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
갑자기 Template>Scripts 폴더는 어디에서 만들어졌는지...
..
-
미해결유니티 머신러닝 에이전트 완전정복 (응용편)
예제 파일 실행 오류
a09.rnd_ppo.pya11.hypernetworks_ppo.py이 두 파일이 실행이 안됩니다. 나머지 파일은 잘 실행되네요.
-
미해결엑셀로 만드는 딥러닝 프레임워크
강의자료 다운로드 관련
안녕하세요?강의 스타일은 일반인들이 접하기 쉽게 잘 만들어진 것 같습니다.그런데 엑셀파일(excel_deep_함수구성.xlsm) 다운로드를 받았는데내용이 보이지 않는군요...매크로 포함파일이라 그런지 ? 어떤 이유인지 잘 모르겠습니다.Office 2016이고, 경고창 나왔을 때 "편집사용"으로 하였습니다.수고하세요.
-
해결됨유니티 머신러닝 에이전트 완전정복 (응용편)
PPO 알고리즘을 ml-agents learn 명령어로 학습 및 추론할때 메소드 호출 순서 질문
안녕하세요!먼저 기초편에 이어서 응용편 강의를 공개해주셔서 정말 감사합니다!! 해당 강의를 들으면서 PPO 알고리즘을 ml-agents learn 명령어로 학습 할 때와 추론할 때 메소드 호출 순서에 대해서 궁금합니다.이 내용이 궁금한 이유는 각 학습 또는 추론 과정에서 각 메소드별로 연산 시간을 측정하기 위해서 입니다. 관련 자료를 어디서 확인할 수 있을까요? 감사합니다!
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
mlagents-learn 에러 수정 방법을 문의드립니다.
안녕하세요 강의 잘 듣고 있습니다. 제가 Unity에서 3DBall 실행까지는 성공시켰습니다. 그런데 Anaconda 가상 환경에서 mlagents-learn 을 사용하여서 config\ppo\3DBall.yaml 유니티 빌드 경로 --run-id=tutorial_1 을 실행하는 것에서 에러가 떴습니다. 어떻게 수정을 해야 하는자 정말 모르겠습니다. 알려주시면 감사하겠습니다.
-
미해결프로그래머를 위한 강화학습(저자 직강)
MyModel(tf.keras.Model)에 action matrix와 reward와 관련해서
training시에 필요한 action matrix와 reward를 받기위해 inputs에 dummy로 input_action_matrixs와 input_rewards를 정의하고 있는것처럼 보이는데요. 이렇게 하지않고 MyModel에 예를들면 setActionMatrixs, setRewards 이런식으로 함수를 정의하고 fit를 호출하기전에 set함수를 호출하여도 될것 같은데, 이렇게 했을때 단점이 있나요?