목록AI/PyTorch (19)
꺼내먹는지식 준
Single layer 싱글 layer의 weight 초기화를 위해 torch.nn.init함수를 사용할 수 있다. conv1 = torch.nn.Conv2d(...) torch.nn.init.xavier_uniform(conv1.weight) 대안으로, parameters 를 weight.data 에 접근하여 조정할 수 있다. (torch.Tensor) conv1.weight.data.fill_(0.01) biases에도 동일하게 적용된다. conv1.bias.data.fill_(0.01) nn.Sequential or custom nn.Module 초기화 함수를 torch.nn.Module.apply로 넘긴다. 이는 nn.Module의 모든 weight 를 recursive 하게 초기화 한다. app..
softmax 는 dim 을 지정해서 apply 할 수 있다. test = torch.randn(2,3,2) print(F.softmax(test, dim = 0)) print(F.softmax(test, dim = 1)) print(F.softmax(test, dim = 2)) 3D tensor에 0차원 1차원 2차원에 softmax를 apply 하고 결과를 보자. dim = 2 결과 부터 보면 2차원 원소들에 softmax 가 취해진 것을 볼 수 있다. 0.7388 + 0.2612 = 1 0.4158 + 0.5842 = 1 dim = 1 결과를 보면, (3) 0.5528 + 0.3504 + 0.0968 = 1 dim =2 결과를 보면, (2) 0.4200 + 0.5800 = 1 0.0447 + 0.9..

pytorch 에서 함수 사용할 때 마다 인자로 dim 을 줄 때 차원이 햇갈렸다. 이에 따라 간략 정리 한번 한다. (일단 axis 와 dim 은 같다는걸 인지하고 시작하자.) 2D, 3D, 4D 에서 torch.cat 을 수행하며 차원에 따른 concat 결과를 명확하게 봐보자. a = torch.randn(7,3) b = torch.randn(7,3) print(torch.cat((a,b),axis=0).shape) print(torch.cat((a,b),axis=1).shape) a = torch.randn(7,3,5) b = torch.randn(7,3,5) print(torch.cat((a,b),axis=0).shape) print(torch.cat((a,b),axis=1).shape) pri..

맨날 transform(img) image tranform 하는 것만 보다가 갑작스럽게 image, bboxes, labels가 모두 transform의 매개변수로 들어가는 걸 보고 당황했다. 주변인의 도움을 받아 해결 참고 코드는 다음과 같다. transforms = get_train_transform(resize_H, resize_W) def get_train_transform(h, w): return A.Compose([ A.Resize(height = h, width = w), A.Flip(p=0.5), ToTensorV2(p=1.0) ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']}) sample = { 'image': im..
해당 에러는 require_grad = Fasle 즉 미분을 할 수 없는 상태인데 미분을 진행하고자 할 때 발생하는 에러이다. 대부분의 경우는 하단의 disscussion에서 ptrblck님이 답변을 통해 다뤄주셨다. 대부분은 detach 로 variable을 복사하였을 때 자동으로 require_grad=False 되는 것을 인지 못한 사례이다. https://discuss.pytorch.org/t/element-0-of-tensors-does-not-require-grad-and-does-not-have-a-grad-fn/32908/36?page=2 Element 0 of tensors does not require grad and does not have a grad_fn following is t..

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same 얼핏 보면, input type 은 cuda 에 올렸는데 weight type이라고 하니까 감이 잘 안온다. model을 올리지 않았다고 하는건가 싶다. 나도 동일한 에러가 났었는데 다는 model type 이라고 분명하게 명시 되어있었다. 이때는 모델을 cuda 에 올리니까 바로 해결이 되었다. 그럼 이 에러는 어떤 상황에서 발생하였는가? 신규범_T3116 고수 캠퍼의 말을 빌려보자. 일반 list말고 ModuleList 써보세요 일반 List는 attribute로 외부에 안 나타나기 때문에 cuda로 보낼때 타겟으로..
이전글에서는 tensorboard 를 직접사용해보기 전 단계에서 글을 작성해서 남의 표현을 빌려서 전달했다. 이번에는 tensor board 를 사용해본 입장에서 정리를 해본다. 사실 근데 나는 Wandb (Weight and Bias)로 갈아탈 예정이다. 그래서 이 글을 읽는 사람들에게도 웬만하면 Wandb 사용을 추천한다. Tensorboard 와 동일한 기능이지만 웹을 통해 접근 가능하고, 프로젝트 별로 저장 된다. 안쓸 이유가 없다. from pytorch_lightning.loggers import TensorBoardLogger logger = TensorBoardLogger(config.log_name) log_name 은 사전에 설정해놓은 tensorboard를 저장할 때 사용할 폴더명이다..

sklearn StratifieldKFold 의 용례에 대해 정리해본다. 당연히 official doc 을 보면 되지만, 생각보다 직관적이지 않다. StratifieldKFold는 기존 Fold와 뭐가 다를까? 간단하게 설명하면 Fold는 무작정으로 데이터를 섞는다면, StratifieldKFold는 데이터 분포에서 적정 비율에 맞게 데이터를 나눠준다. 즉 한쪽으로 치우칠 일을 최대한으로 방지한다. 즉, 분포로 나눠줄 수 있도록 y 값(데이터 분포를 볼)을 제공해주어야 한다. skf = StratifiedKFold( n_splits=5, shuffle=True, random_state=42 ) 통상 5개로 나눈다. random_state 즉 random seed는 주로 42로 준다. random seed..

학습이 잘 되는지 않되는지를 관찰할 수 있는 좋은 Monitoring Tool이 있다. Loss 값의 변화, Accuracy의 변화 등을 관찰 할 수 있다. 학습은 오랜 시간이 걸리기 때문에 관측이 필수이다. 보통 Tensorboard, Weight & Biases 를 사용한다. Tensorboard TensorFlow의 프로젝트로 만들어진 시각화 도구 학습 그래프, metric, 학습 결과의 시각화 지원 Pytorch도 연결이 가능해서 DL 시각화의 기본 핵심 기능이다. 1) scalar : metric 등 상수 값의 연속(epoch)을 표시 2) graph : 모델의 computational graph 표시 3) hisogram: weight 등 값의 분포를 표현 (보통 정규분포가 나오기를 기대한다...

학습 된 데이터를 불러와서 적용하는 Transfer Learning 은 기본이 된지 오래다. 이제부터 Transfer Learning을 하기 위한 과정들을 공부 해보고자 한다. 첫번째로 모델 저장, checkpoint, 모델 불러오기를 보자 학습 결과를 한번 공유하려면 어떻게 해야 할까? 1) 모델 저장, 불러오는 방법 model.save() 1) 학습 중, 학습 결과를 중간 중간 model 형태와 parameter를 저장 parameter만 저장해서 같은 모델을 돌릴 때, parameter만 넣어줄 수도 있다. 2) 중간 과정 저장을 통해 최선의 결과 모델 선택 3) 만들어진 모델을 외부 연구자와 공유 학습 재연성 향상 저장 MODEL_PATH= "saved" if not os.path.exists(M..