173만명의 커뮤니티!! 함께 토론해봐요.
미해결
[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
안녕하세요 선생님 강의를 열심히 따라 듣고있던 중 세이브 & 로드 구현하고 테스트하는 와중 에러메세지 때문에 몇일 고민하다가 도저히 안되겠어서 글 남깁니다 어딘가 오타가있는건 아닌지 꼼꼼히 확인해봤는데 제눈엔 도저히 찾질 못하겠습니다 ㅜㅜ 우선 에러메세지는 다음과 같습니다 세이브 테스트 오브젝트에 스크립트도 잘 부착하였구요 스크립터블 오브젝트도 강의와 똑같이 만들고 부착하였습니다 어느 스크립트가 문제인지 몰라 Quest, QuestSystem, QuestSystemSaveTest 세가지 스크립트 작성하여 등록하겠습니다 Quest.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using System.Diagnostics; using Debug = UnityEngine.Debug; public enum QuestState { Inactive, Running, Complete, Cancel, WaitingForCompletion // 퀘스트 완료시 자동으로 완료되는게 아닌, 사용자가 퀘스트 완료를 눌러야 완료되는 상태 } [CreateAssetMenu(menuName = "Quest/Quest", fileName ="Quest_")] public class Quest : ScriptableObject { #region Event public delegate void TaskSuccessChangeHandler(Quest quest, Task task, int currentSuccess, int prevSuccess); public delegate void CompleteHandler(Quest quest); public delegate void CancelHandler(Quest quest); public delegate void NewTaskGroupHandler(Quest quest, TaskGroup currentTaskGroup, TaskGroup prevTaskGroup); #endregion [SerializeField] private Category category; [SerializeField] private Sprite icon; [Header("Text")] [SerializeField] private string codeName; [SerializeField] private string displayName; [SerializeField, TextArea] private string description; [Header("Task")] [SerializeField] private TaskGroup[] taskGroups; [Header("Reward")] [SerializeField] private Reward[] rewards; [Header("Condition")] [SerializeField] private Condition[] acceptionConditions; [SerializeField] private Condition[] cancelConditions; [Header("Option")] [SerializeField] private bool useAutoComplete; [SerializeField] private bool isCancelable; // 캔슬 불가능한 퀘스트를 위한 변수 [SerializeField] private bool isSaveable; private int currentTaskGroupIndex; #region 프로퍼티들 public Category Category => category; public Sprite Icon => icon; public string CodeName => codeName; public string DisplayName => displayName; public string Description => description; public QuestState State { get; private set; } public TaskGroup CurrentTaskGroup => taskGroups[currentTaskGroupIndex]; public IReadOnlyList<TaskGroup> TaskGroups => taskGroups; public IReadOnlyList<Reward> Rewards => rewards; public bool IsRegistered => State != QuestState.Inactive; public bool IsCompletable => State == QuestState.WaitingForCompletion; public bool IsComplete => State == QuestState.Complete; public bool IsCancel => State == QuestState.Cancel; public virtual bool IsCancelable => isCancelable && cancelConditions.All(x=>x.IsPass(this)); public bool IsAcceptable => acceptionConditions.All(x => x.IsPass(this)); public virtual bool IsSaveable => isSaveable; #endregion public event TaskSuccessChangeHandler onTaskSuccessChanged; public event CompleteHandler onCompleted; public event CancelHandler onCanceled; public event NewTaskGroupHandler onNewTaskGroup; // Awake 역할의 함수로 Quest가 System에 등록되면 실행될 함수 public void OnRegister() { // 퀘스트를 중복 등록했을경우 에러 발생 Debug.Assert(!IsRegistered, "This quest has already been registered."); foreach (var taskGroup in taskGroups) { taskGroup.Setup(this); foreach (var task in taskGroup.Tasks) task.onSuccessChanged += OnSuccessChanged; } State = QuestState.Running; CurrentTaskGroup.Start(); } public void ReceiveReport(string category, object target, int successCount) { Debug.Assert(IsRegistered, "This quest has already been registered."); Debug.Assert(!IsCancel, "this quest has been canceled"); if (IsComplete) return; CurrentTaskGroup.ReceiveReport(category, target, successCount); if (CurrentTaskGroup.IsAllTaskComplete) { if (currentTaskGroupIndex + 1 == taskGroups.Length) // 다음 taskGroup이 없다면 { State = QuestState.WaitingForCompletion; if (useAutoComplete) Complete(); } else { var prevTaskGroup = taskGroups[currentTaskGroupIndex++]; prevTaskGroup.End(); CurrentTaskGroup.Start(); onNewTaskGroup?.Invoke(this, CurrentTaskGroup, prevTaskGroup); } } else State = QuestState.Running; } public void Complete() { CheckIsRunning(); foreach (var taskGroup in taskGroups) taskGroup.Complete(); State = QuestState.Complete; foreach (var reward in rewards) { reward.Give(this); } onCompleted?.Invoke(this); onTaskSuccessChanged = null; onCompleted = null; onCanceled = null; onNewTaskGroup = null; } public virtual void Cancel() { CheckIsRunning(); Debug.Assert(IsCancelable, "this quest can't be canceled"); State = QuestState.Cancel; onCanceled?.Invoke(this); } public Quest Clone() { var clone = Instantiate(this); clone.taskGroups = taskGroups.Select(x => new TaskGroup(x)).ToArray(); return clone; } public QuestSaveData ToSaveData() { return new QuestSaveData { codeName = codeName, state = State, taskGroupIndex = currentTaskGroupIndex, taskSuccessCounts = CurrentTaskGroup.Tasks.Select(x => x.CurrentSuccess).ToArray() }; } public void LoadFrom(QuestSaveData saveData) { State = saveData.state; currentTaskGroupIndex = saveData.taskGroupIndex; for (int i = 0; i < currentTaskGroupIndex; i++) { var taskGroup = taskGroups[i]; taskGroup.Start(); taskGroup.Complete(); } for (int i = 0; i < saveData.taskSuccessCounts.Length; i++) { CurrentTaskGroup.Start(); CurrentTaskGroup.Tasks[i].CurrentSuccess = saveData.taskSuccessCounts[i]; } } private void OnSuccessChanged(Task task, int currentSuccess, int prevSuccess) => onTaskSuccessChanged?.Invoke(this, task, currentSuccess, prevSuccess); [Conditional("UNITY_EDITOR")] // 유니티 에디터로 시행할때만 작동하도록 함 private void CheckIsRunning() { Debug.Assert(IsRegistered, "This quest has already been registered."); Debug.Assert(!IsCancel, "this quest has been canceled"); Debug.Assert(!IsComplete, "this quest has already been completed"); } } QuestSystem.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using Newtonsoft.Json.Linq; public class QuestSystem : MonoBehaviour { #region Save Path private const string kSaveRootPath = "questSystem"; private const string kActiveQuestsSavePath = "activeQuests"; private const string kCompletedQuestsSavePath = "completedQuests"; private const string kActiveAchievementsSavePath = "activeAchievements"; private const string kCompletedAchievementsSavePath = "completedAchievements"; #endregion #region Events public delegate void QuestRegisteredHandler(Quest newQuest); public delegate void QuestCompletedHandler(Quest quest); public delegate void QuestCanceledHandler(Quest quest); #endregion private static QuestSystem instance; private static bool isApplicationQuitting; public static QuestSystem Instance { get { if(!isApplicationQuitting && instance == null) { instance = FindObjectOfType<QuestSystem>(); if(instance == null) { instance = new GameObject("Quest System").AddComponent<QuestSystem>(); DontDestroyOnLoad(instance.gameObject); } } return instance; } } private List<Quest> activeQuests = new List<Quest>(); private List<Quest> completedQuests = new List<Quest>(); private List<Quest> activeAchievements = new List<Quest>(); private List<Quest> completedAchievements = new List<Quest>(); private QuestDatabase questDatabase; private QuestDatabase achievementDatabase; public event QuestRegisteredHandler onQuestRegistered; public event QuestCompletedHandler onQuestCompleted; public event QuestCanceledHandler onQuestCanceled; public event QuestRegisteredHandler onAchievementRegistered; public event QuestCompletedHandler onAchievementCompleted; public IReadOnlyList<Quest> ActiveQuests => activeQuests; public IReadOnlyList<Quest> CompletedQuests => completedQuests; public IReadOnlyList<Quest> ActiveAchievements => activeAchievements; public IReadOnlyList<Quest> CompletedAchievements => completedAchievements; private void Awake() { questDatabase = Resources.Load<QuestDatabase>("QuestDatabase"); achievementDatabase = Resources.Load<QuestDatabase>("AchievementDatabase"); if(!Load()) // 저장된 데이터가 없다면 업적에 등록 { foreach (var achievement in achievementDatabase.Quests) Register(achievement); } } private void OnApplicationQuit() { isApplicationQuitting = true; Save(); } public Quest Register(Quest quest) { var newQuest = quest.Clone(); if(newQuest is Achievement) { newQuest.onCompleted += OnAchievementCompleted; activeAchievements.Add(newQuest); newQuest.OnRegister(); onAchievementRegistered?.Invoke(newQuest); } else { newQuest.onCompleted += OnQuestCompleted; newQuest.onCanceled += OnQuestCanceled; activeQuests.Add(newQuest); newQuest.OnRegister(); onQuestRegistered?.Invoke(newQuest); } return newQuest; } // 내부용 private void ReceiveReport(List<Quest> quests, string category, object target, int successCount) { foreach (var quest in quests.ToArray()) quest.ReceiveReport(category, target, successCount); } //외부용 public void ReceiveReport(string category, object target, int successCount) { ReceiveReport(activeQuests, category, target, successCount); ReceiveReport(activeAchievements, category, target, successCount); } public void ReceiveReport(Category category, TaskTarget target, int successCount) => ReceiveReport(category.CodeName, target.Value, successCount); // 수업자료 보고 추가한 메서드 public void CompleteWaitingQuests() { foreach (var quest in activeQuests.ToList()) { if (quest.IsCompletable) quest.Complete(); } } public bool ContainsInActiveQuests(Quest quest) => activeQuests.Any(x => x.CodeName == quest.CodeName); public bool ContainsInCompletedQuests(Quest quest) => completedQuests.Any(x => x.CodeName == quest.CodeName); public bool ContainsInActiveAchievements(Quest quest) => activeAchievements.Any(x => x.CodeName == quest.CodeName); public bool ContainsInCompletedAchievements(Quest quest) => completedAchievements.Any(x => x.CodeName == quest.CodeName); private void Save() { var root = new JObject(); root.Add(kActiveQuestsSavePath, CreateSaveDatas(activeQuests)); root.Add(kCompletedQuestsSavePath, CreateSaveDatas(completedQuests)); root.Add(kActiveAchievementsSavePath, CreateSaveDatas(activeAchievements)); root.Add(kCompletedAchievementsSavePath, CreateSaveDatas(completedAchievements)); PlayerPrefs.SetString(kSaveRootPath, root.ToString()); PlayerPrefs.Save(); } private bool Load() { if (PlayerPrefs.HasKey(kSaveRootPath)) { var root = JObject.Parse(PlayerPrefs.GetString(kSaveRootPath)); LoadSaveDatas(root[kActiveQuestsSavePath], questDatabase, LoadActiveQuest); LoadSaveDatas(root[kCompletedQuestsSavePath], questDatabase, LoadCompletedQuest); LoadSaveDatas(root[kActiveAchievementsSavePath], achievementDatabase, LoadActiveQuest); LoadSaveDatas(root[kCompletedAchievementsSavePath], achievementDatabase, LoadCompletedQuest); return true; } else return false; } private JArray CreateSaveDatas(IReadOnlyList<Quest> quests) { var saveDatas = new JArray(); foreach (var quest in quests) { if(quest.IsSaveable) saveDatas.Add(JObject.FromObject(quest.ToSaveData())); // SaveData를 Json형태로 변환하여 JsonArray에 넣어줌 } return saveDatas; } private void LoadSaveDatas(JToken datasToken, QuestDatabase database, System.Action<QuestSaveData, Quest> OnSuccess) { var datas = datasToken as JArray; foreach (var data in datas) { var saveData = data.ToObject<QuestSaveData>(); var quest = database.FindQuestBy(saveData.codeName); OnSuccess.Invoke(saveData, quest); } } private void LoadActiveQuest(QuestSaveData saveData, Quest quest) { var newQuest = Register(quest); newQuest.LoadFrom(saveData); } private void LoadCompletedQuest(QuestSaveData saveData, Quest quest) { var newQuest = quest.Clone(); newQuest.LoadFrom(saveData); if (newQuest is Achievement) completedAchievements.Add(newQuest); else completedQuests.Add(newQuest); } #region Callback private void OnQuestCompleted(Quest quest) { activeQuests.Remove(quest); completedQuests.Add(quest); onQuestCompleted?.Invoke(quest); } private void OnQuestCanceled(Quest quest) { activeQuests.Remove(quest); onQuestCanceled?.Invoke(quest); Destroy(quest, Time.deltaTime); } private void OnAchievementCompleted(Quest achievement) { activeAchievements.Remove(achievement); completedAchievements.Add(achievement); onAchievementCompleted?.Invoke(achievement); } #endregion } QuestSystemSaveTest.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class QuestSystemSaveTest : MonoBehaviour { [SerializeField] private Quest quest; [SerializeField] private Category category; [SerializeField] private TaskTarget target; private void Start() { var questSystem = QuestSystem.Instance; if(questSystem.ActiveQuests.Count == 0) { Debug.Log("Register"); var newQuest = questSystem.Register(quest); } else { questSystem.onQuestCompleted += (quest) => { Debug.Log("Complete"); PlayerPrefs.DeleteAll(); PlayerPrefs.Save(); }; } } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) QuestSystem.Instance.ReceiveReport(category, target, 1); } } 이상입니다..
YESGO OH
2023-01-30T12:43:37.584Z
댓글 1
좋아요 0
조회수 488
미해결
유니티 머신러닝 에이전트 완전정복 (기초편)
안녕하세요 DDPG 부분까지 재밌게 수강했습니다. 드론이 랜덤하게 생성되는 particle (goal)에 도달하는 것 말고 유니티 상에서 경로를 생성해 준 후 그 경로를 goal이라고 지정한 후에, 그 경로를 잘 따라가게끔 하는 것을 실습해보고자 합니다. 혹시, 유니티에서 경로를 생성하게끔 해주는 툴을 알고 계신가요? 강의 내용과는 거리가 있지만, 알고 계시다면 답변 부탁드립니다.
머신러닝 unity 강화학습 강화학습 머신러닝 배워볼래요? unity-ml-agents
승주
2023-01-30T12:40:09.408Z
댓글 2
좋아요 0
조회수 486
미해결
스프링 시큐리티 OAuth2
안녕하세요 선생님 강의 잘듣고 있습니다 오늘 처음으로 spring 시큐리티와 keycloak 와 사용해서 간단한 RestController 을 만들어서 keycloak 로 로그인하는 강의를 들었는데 궁금점이 생겼습니다 applition.yml redirect 구성하실때 http://localhost:8081/login/oauth2/code/keycloak 이 주소가 시큐리티 ouath2 로그인 고유 주소인가요? 제가 테스트한다고 oauth2 에 다른 문자열을 넣고 돌리면 리디렉션이 너무 많다고 크롬 , 엣지에서 오류가 발생합니다 ex1) clientId - OAuth2-client-app redirectUri= http://localhost:8081/login/oauth2/code/keycloak ex2)clientId - OAuth2-client-app redirectUri= http://localhost:8081/login/OAuth2-client-app/code/keycloak 이렇게 비교를 해보았는데 1번은 로그인이 잘되고 2번은 계속 무한 리디렉션이 나옵니다 그래서 ex1) 번을 크롬 개발자 도구로 쫒아 가보니 1) http://localhost:8081/oauth2/authorization/keycloak status :302 Location: http://localhost:8080/realms/spring-security-OAuth2/protocol/openid-connect/auth?response_type=code&client_id=OAuth2-client-app&scope=openid%20email%20profile&state=wNz-VZFRvu_Nr8KUFYjRshELNLOFbUZVO9vWdcEQrs4%3D&redirect_uri=http://localhost:8081/login/oauth2/code/keycloak&nonce=ehS4VAjQJBrDf7APtHtUbWuzwdOnCJAOd8BhRhSohoU 2) http://localhost:8080/realms/spring-security-OAuth2/protocol/openid-connect/auth?response_type=code&client_id=OAuth2-client-app&scope=openid%20email%20profile&state=wNz-VZFRvu_Nr8KUFYjRshELNLOFbUZVO9vWdcEQrs4%3D&redirect_uri=http://localhost:8081/login/oauth2/code/keycloak&nonce=ehS4VAjQJBrDf7APtHtUbWuzwdOnCJAOd8BhRhSohoU status : 302 Location: http://localhost:8081/login/oauth2/code/keycloak?state=wNz-VZFRvu_Nr8KUFYjRshELNLOFbUZVO9vWdcEQrs4%3D&session_state=0e8d5564-fa24-4521-9bd9-bd931d42beb7&code=58d084f3-272e-4e31-ad4d-edc808fde122.0e8d5564-fa24-4521-9bd9-bd931d42beb7.e3344d0f-ca0d-44fd-8993-08b7b90ca190 3) http://localhost:8081/login/oauth2/code/keycloak?state=wNz-VZFRvu_Nr8KUFYjRshELNLOFbUZVO9vWdcEQrs4%3D&session_state=0e8d5564-fa24-4521-9bd9-bd931d42beb7&code=58d084f3-272e-4e31-ad4d-edc808fde122.0e8d5564-fa24-4521-9bd9-bd931d42beb7.e3344d0f-ca0d-44fd-8993-08b7b90ca190 status : 302 Location: http://localhost:8081/ 스프링 시큐리티 안에서 oauth2 가 가지는 고유의 엔드포인트 라고 생각을 해야 하는게 맞는거겠죠? 무한리디렉션이 생기는 이유는 솔직히 모르겠습니다 아마 로그인 권한은 획득했는데.. 그 이후는 잘 모르겠습니다.
spring java oauth spring-boot
김동연
2023-01-30T12:35:19.151Z
댓글 1
좋아요 0
조회수 1129
미해결
처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 (쉽게! 기본부터 챗GPT 핵심 트랜스포머까지) [데이터분석/과학 Part3]
첨부해주신 코드를 복사 붙여넣기 했는데, 오류가 나네요.. ㅠㅠ 오류명은 : ---> 21 class CustomDataset(Dataset): 22 def init (self, file_list, transform=None): 23 self.file_list = file_list TypeError: str() argument 'encoding' must be str, not tuple dataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test) CustomDataset 클래스를 통해, train, valid, test를 만들어주는 과정에서, str() arguments를 받아야 한다는 것 같은데.. 왜 오류가 나는지 잘 모르겠습니다. from torchvision import transforms input_size = 224 transforms_for_train = transforms.Compose([ transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.RandomRotation(10), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) transforms_for_val_test = transforms.Compose([ transforms.Resize(input_size), transforms.CenterCrop(input_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) #class Dataset class CustomDataset(Dataset): def __init__(self, file_list, transform=None): self.file_list = file_list self.transform = transform def __len__(self): return len(self.file_list) def __getitem__(self, idx): img_path = self.file_list[idx] if img_path.split('/')[-1][-3:] == 'jpg': img = Image.open(img_path) if self.transform is not None: img_transform = self.transform(img) label = img_path.split('/')[-1].split('.')[0] if label == 'dog': label = 1 elif label == 'cat': label = 0 return img_transform, label dataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test) # from torch.utils.data import DataLoader # 데이터 로더 클래스 # # train_batches = DataLoader(dataset=dataset_train, batch_size=8, shuffle=True) # val_batches = DataLoader(dataset=dataset_valid, batch_size=8, shuffle=False) # test_batches = DataLoader(dataset=dataset_test, batch_size=8, shuffle=False) 강의 내용과 같이 len(train_list), len(val_list)가 잘 출력이 됨을 볼 수 있고, Reference 항목에서 특정 img의 사이즈를 출력해볼 떄도, (500, 374) 라고 잘 출력됨을 알 수 있었습니다. train할 데이터와 test 데이터는 강의 중에 배운 os 명령어 및 with zip 명령어를 사용해서 <오류 화면 입니다.> 전체 작성한 코드 첨부드립니다. import zipfile Dataset = 'dogs-vs-cats-redux-kernels-edition' with zipfile.ZipFile('../BecomeProfessional/' + Dataset + ".zip", "r") as z: z.extractall(".") import pandas as pd import numpy as np import warnings warnings.filterwarnings('ignore') from PIL import Image import torch import torch.nn as nn from torch.utils.data import DataLoader, Subset from torchvision import datasets, transforms from sklearn.model_selection import train_test_split from copy import deepcopy import matplotlib.pyplot as plt import os, shutil import random import os #device 설정 device = 'cuda' if torch.cuda.is_available() else 'cpu' print(device) seed = 42 # seed값 설정 random.seed(seed) # 파이썬 난수 생성기 os.environ['PYTHONHASHSEED'] = str(seed) # 해시 시크릿값 고정 np.random.seed(seed) # 넘파이 난수 생성기 torch.manual_seed(seed) # 파이토치 CPU 난수 생성기 torch.backends.cudnn.deterministic = True # 확정적 연산 사용 설정 torch.backends.cudnn.benchmark = False # 벤치마크 기능 사용 해제 torch.backends.cudnn.enabled = False # cudnn 기능 사용 해제 if device == 'cuda': torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) original_data_path = './Dog_Cat/' os.makedirs('dogsvscats', exist_ok=True) import zipfile with zipfile.ZipFile(os.path.join(original_data_path, 'train.zip')) as train_zip: train_zip.extractall('./Dog_Cat/dogsvscats') with zipfile.ZipFile(os.path.join(original_data_path, 'test.zip')) as test_zip: test_zip.extractall('./Dog_Cat/dogsvscats') import glob print(glob.glob('./Dog_Cat/dogsvscats/train/*')) 출력: ./Dog_Cat/dogsvscats/train\\cat.11346.jpg', './Dog_Cat/dogsvscats/train\\cat.11347.jpg', './Dog_Cat/dogsvscats/train\\cat.11348.jpg', './Dog_Cat/dogsvscats/train\\cat.11349.jpg', ' .... (엄청 많이 출력됩니다) train_dir = './Dog_Cat/dogsvscats/train' test_dir = './Dog_Cat/dogsvscats/test' all_train_files = glob.glob(os.path.join(train_dir, '*.jpg')) test_list = glob.glob(os.path.join(test_dir, '*.jpg')) train_labels = [path.split('/')[-1].split('.')[0] for path in all_train_files] train_list, val_list = train_test_split(all_train_files, test_size=0.1, stratify=train_labels, random_state=seed) print(len(train_list), len(val_list)) 출력: 22500 2500 train_list[0] 출력: './Dog_Cat/dogsvscats/train\\cat.4814.jpg' img = Image.open('./Dog_Cat/dogsvscats/train/cat.4814.jpg') img.size 출력: (500, 374) import IPython image1 = IPython.display.Image(filename='./Dog_Cat/dogsvscats/train/cat.4814.jpg') display(image1) from torchvision import transforms input_size = 224 transforms_for_train = transforms.Compose([ transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.RandomRotation(10), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) transforms_for_val_test = transforms.Compose([ transforms.Resize(input_size), transforms.CenterCrop(input_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) #class Dataset class CustomDataset(Dataset): def __init__(self, file_list, transform=None): self.file_list = file_list self.transform = transform def __len__(self): return len(self.file_list) def __getitem__(self, idx): img_path = self.file_list[idx] if img_path.split('/')[-1][-3:] == 'jpg': img = Image.open(img_path) if self.transform is not None: img_transform = self.transform(img) label = img_path.split('/')[-1].split('.')[0] if label == 'dog': label = 1 elif label == 'cat': label = 0 return img_transform, label dataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test) 오류 발생
머신러닝 딥러닝 인공신경망 머신러닝 배워볼래요? 인공신경망 딥러닝 pytorch vision-transformer
minsubrother
2023-01-30T12:03:14.776Z
댓글 1
좋아요 0
조회수 493
미해결
[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
계정의 프로젝트 한도에 도달했습니다. 기존 프로젝트에 Firebase를 추가하거나 한도 상향을 요청할 수 있습니다. 이렇게 나오길래 이동해서 몇가지 작성해서 보냈습니다 그 후 이런 메일이 왔는데 어떤 것을 추가로 회신해야 할까요?
fgvcxg
2023-01-30T11:57:01.848Z
댓글 1
좋아요 0
조회수 939
미해결
[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
https://www.inflearn.com/questions/760208/comment/237501 여기서 알려주신데로 다른 곳에서 Room을 이용하여 만드는 메모장 앱을 따라 만들어봤는데 바인딩같은 개념을 잘 모르니까 따라해도 이해가 안가고 어렵더라구요 .. 왕초보편 듣고 바로 제트팩 개론 강의로 넘어가도 될까요 ??
qweasdsa46
2023-01-30T11:34:34.322Z
댓글 1
좋아요 0
조회수 331
미해결
나만의 캐릭터를 만들 수 있는 지브러시 (Zbrush) 기초
안녕하세요 단축기 지정하는 과정에서 잘 안되어 질문을 남깁니다~ ctrl+Alt 한 상태에서 move 브러쉬 클릭 후 7번 눌렀는데 7을 눌러도 무브 브러쉬가 선택이 안되는데 이유가 뭘까요?ㅠ 단축키 지정은 되어있는것 같은데 숫자 7을 눌러도 브러쉬가 변경이 안됩니다 ㅠ 원인을 모르겠네요...! 참고로 지브러쉬 2022.0.7 입니다
멜팅키스
2023-01-30T11:18:59.592Z
댓글 1
좋아요 0
조회수 2165
미해결
국비지원 교육들으면서 공부 중인 학생입니다. 프로젝트를 진행하면서 게시판의 태그 기능을 구현 중인데 DB를 어떤 식으로 설계하는 것이 좋을지 고민입니다. 두 가지 방법이 있을 것 같은데 뭐가 좋을지 조언해주시면 감사하겠습니다. 태그 값들을 하나의 컬럼에 쉼표나 띄어쓰기를 이용해서 구분해서 하나의 String값으로 만든다음, 이를 게시판 테이블에 넣는다. 이 경우 게시판 테이블, 태그 명을 저장하는 테이블 2개가 필요합니다. 태그 값들을 테이블과, 태그명 테이블의 기본키를 외래키로 받는 테이블을 따로 만들어서 태그 값들을 이 테이블에 넣는다. 이 경우 게시판 테이블, 태그 명을 저장하는 테이블, 태그 값들을 저장하는 테이블 3개가 필요합니다. 뭔가 2번의 방법이 DB설계에 있어서 무결성, 정규화 등을 고려했을 때 더 맞는 방법인 것 같은데 국비 지원 강사 님께 여쭤보니 강사님께서는 실무에서는 1번의 방법으로 구현을 한다고 하시더라고요. 여러분들의 의견 부탁 드립니다!
백엔드 주니어 개발자
2023-01-30T11:10:31.164Z
댓글 0
좋아요 0
조회수 698
미해결
설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
질문글은 환영합니다!!! 작성하시기 전에 다음을 확인 부탁드려요 :) ============================================================================ 강의에서 다룬 내용들의 질문들을 부탁드립니다!! (강의내용을 듣고 이해가 안되었던 부분들, 강의의 오류 등등) 이런 질문은 부담스러워요.. 개인 과제, 강의에서 다루지 않은 내용들의 궁금증 해소, 영상과 다른 접근방법 후 디버깅 요청, 고민 상담 등.. 글쓰기 에티튜드를 지켜주세요 (저 포함, 다른 수강생 분들이 함께보는 공간입니다.) 서로 예의를 지키며 존중하는 문화를 만들어가요. 질문글을 보고 내용을 이해할 수 있도록 남겨주시면 답변에 큰 도움이 될 것 같아요. (상세히 작성하면 더 좋아요! ) 먼저 유사한 질문이 있었는지 검색해보세요. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. =============================================== ============================= can't connect to X11 window server using '10.0' 라고 뜨면서 vivado 실행이 갑자기 안되네요 원래 잘됐었는데 뭐가문제인지모르겠습니다.ㅜㅠ
0000 VerilogOnline
2023-01-30T11:05:23.770Z
댓글 2
좋아요 1
조회수 3282
미해결
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
입문강의에만 있는 내용이 있을까해서요
2023-01-30T10:48:23.477Z
댓글 1
좋아요 0
조회수 490
미해결
실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
4:40에.. extends ApiTest 하면서 SpringBootTest 어노테이션을 지웁니다! 에러를 계속 마주치다가 간신히 찾았군요..
doxxx93
2023-01-30T10:46:31.158Z
댓글 5
좋아요 18
조회수 1526
미해결
[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
pub get 한 이후에 main.dart 로 돌아오니 코드작성하는 곳 상단에 pubspec has been edited라고 뜨고 Get dependencies Upgrade dependencies ignore 이라고 뜨는데 무시하면 되는건가요?
oosui
2023-01-30T10:12:49.195Z
댓글 1
좋아요 0
조회수 684
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 테스트 작성만하면 이런오류가나네요 무슨문제일까요
spring spring-boot 웹앱 웹앱 java jpa JPA
장현철
2023-01-30T10:10:03.481Z
댓글 1
좋아요 0
조회수 782
미해결
설계독학맛비's 실전 AI HW 설계를 위한 바이블, CNN 연산 완전정복 (Verilog HDL + FPGA 를 이용한 가속기 실습)
안녕하세요, 강의 잘 듣고 있습니다. 질문이 있는데요, Lab2 Practice 1의 3분 13초 에서 빨간색 네모 박스가 앞선 연산과 동일하다고 말씀하셨어요. 앞선 연산은 필터의 크기 (KX, KY)와 동일한 크기를 가지는 CI개 채널 입력에 대한 CO개 만큼의 출력을 생성하는 연산으로 이해됩니다. 그러면 빨간 네모 박스 연산이 위 연산과 동일하려면 첫 번째 라인의 for문이 지금처럼 (y, E: 출력 픽셀 y축 위치) 에 대한 for문이 아니라 출력 채널의 수 (m, M: 출력 채널 수) 가 되어야 하는 것 아닌지요? (C코드에서의 m 이 연산 그림에서의 CO로 이해됩니다.) 감사합니다.
verilog-hdl fpga 임베디드 cnn 임베디드
coldugs
2023-01-30T10:08:02.993Z
댓글 1
좋아요 1
조회수 557
미해결
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 아니오 [질문 내용] 이전 도메인 설계 강의 듣기로 연관관계에 있는 두 엔티티의 관계를 변경하려면, 주인엔티티의 값을 변경하면 된다고 하셨고, mappedBy 가 선언된 종속(?)엔티티는 값을 변경하더라도 연관관계가 변경되지 않는다고 하셨던것 같은데요. 그럼 연관관계를 설정할때 주인엔티티에만 설정해주면 되지 않나요? 이 강의에서 나오는 연관관계 메소드에서는 Order 엔티티에도 member를 세팅해주고, Memeber 엔티티의 List<Order>에도 order 를 add해주도록 되어 있어서 왜 둘다 세팅하는지 문의드립니다.
spring-boot 웹앱 웹앱 spring spring-boot JPA jpa java
leesh83
2023-01-30T10:05:46.621Z
댓글 1
좋아요 0
조회수 554
미해결
CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조
안녕하세요 공부하다가 잘 모르겠는 부분이 있어 질문드립니다. TCP/IP 4계층과 OSI 7계층을 공부하다가 두개로 나눠진 이유에 대해서 궁금해졌습니다. 구글링을 해도 명확하게 답변이 있는 곳이 없어 질문드립니다. 강의와 책에서는 어플리케이션 계층과 링크 계층을 OSI 7계층에서 조금 더 세분화한 것과 인터넷 계층, 네트워크 계층의 이름의 차이로 확인됩니다. 하지만, 근본적으로 두 가지가 나눠진 이유와 명확한 장단점, 실제로는 어떤 방식으로 통신이 이뤄지는지 잘 모르겠습니다. TCP/IP OSI 두가지로 나눠진 이유 각각의 명확한 장단점 각 계층을 나누는 이유는? 이 부분은 "통신이 일어나는 과정을 단계별로 알 수 있고, 이상이 생기면 대응하기 쉽기 때문이다. " 라고 생각합니다. 실제 환경에서 어떤 방식을 사용하는지 예시가 있으면 좋을 것 같습니다! 책과 강의를 통해 항상 큰 도움받고 있습니다! 바쁘시겠지만, 답변 부탁드립니다!
박현기
2023-01-30T09:59:27.482Z
댓글 1
좋아요 0
조회수 999
해결됨
[리뉴얼] 처음하는 파이썬 데이터 분석 (쉽게! 전처리, pandas, 시각화 전과정 익히기) [데이터분석/과학 Part1]
가장 값이 높은 데이터를 선택해서, Red색으로 변경하고 싶은데, 구글링을 통해 찾아봤는데 어떻게 바꾸어야 할지 모르겠어서 질문드립니다. 아래 사이트에 있는 것처럼 바꾸고 싶습니다. https://community.plotly.com/t/how-to-highlight-a-single-bar-on-select-in-plotly-dash/60739/3
minsubrother
2023-01-30T09:35:52.911Z
댓글 1
좋아요 0
조회수 954
미해결
따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
docker-compose up --build 명령어 입력시 아래와 같은 에러가 발생하면 생성된 이미지를 제거하고 다시 명령어를 입력해보세요. (저같은 경우 제거하니 정상적으로 작동하네요)
github aws docker cicd 데이터 엔지니어링 travis-ci
김기쁨
2023-01-30T09:34:26.382Z
댓글 1
좋아요 1
조회수 1081
해결됨
Vue3 완벽 마스터: 기초부터 실전까지 - "실전편"
안녕하세요. 강의 매우 잘 듣고 있습니다. 감사합니다. 수강 중 질문이 있는데요. 1.실전편, 네비게이션 가드 설명 중 beforeEnter: [removeQueryString], 위와 같이 beforeEnter를 배열로 연결해서 여러개의 가드를 연결할 수 있는 것 같은데, 이렇게 배열로 연결할 수 있는 이유는 무엇인가요? 하나의 메서드만 연결할 수 있을 것 같은데 말이죠... 2. 플러그인 기능을 활용한 글로벌 컴포넌트 생성 중 unplugin-vue-components 에 대해 소개해 주셨는데 혹시 이 모듈은 실제 프로젝트에서 사용해도 될 만큼 안정성이 있는 것인지 궁금합니다. 감사합니다.
vuetiful
2023-01-30T09:21:54.440Z
댓글 1
좋아요 0
조회수 400
해결됨
10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
http://boj.kr/30fb42b6aa1946dea6fb4494acefe8d0 해당 풀이가 틀린 이유를 모르겠습니다.
데자르
2023-01-30T09:16:20.671Z
댓글 1
좋아요 0
조회수 337