분석 Python/Pytorch(28)
-
TimeSeries) [MultiHead Self Attention] multi target 예측
새로운 모델 구조 만들어보기 해당 시도는 Multi Head Self Attention을 이용하면, 각 Head 마다 고유한 특징을 잡는 것을 이용하여 예측하는 코드와 분석을 통해서, gradient 실제로 다르게 가는 지를 확인하고자 함. Load Library import numpy as np import torch import matplotlib.pyplot as plt import torch.optim as optim from IPython.display import clear_output 데이터 정의 이번 블로그에서는 타깃 3개를 예측하는 것을 정의해서 예측하고자 함. # 예제 데이터 생성 t = np.linspace(0, 100, 1000) # 0에서 100까지 1000개의 점 y1 = np...
2023.09.23 -
Pytorch) 모델 가중치 로드 시 테스트 (전체 모델에서 서브 모델 가중치만 가져오기)
상황 조금 더 일반화된 학습을 하기 위해 멀티 타겟에 대한 일반화된 모델을 만들고, 그 모델에서 부분적인 타겟에 대하서 추출할 때 가중치를 잘 가져오는 지에 대한 테스트를 수행해봄. 기대 효과 공유하는 네트워크(Shared Network)가 일반화되게 잘 학습이 되고, 부분적으로 학습시킬 때 좋은 인풋으로써의 기능을 할 수 있지 않을까 함. 방법 각 타겟에 대해서 Dict 으로 키로 관리하고, 나중에 load 시 strict=False를 하면, 알아서 파라미터가 매칭이 안되도 들어갈 것이다라는 생각으로 시작 엄밀하게 제거하는 작업도 있지만, 제거하지 않아도 자동으로 맵핑되는 지 보고 싶었음 코드 중간에 가중치를 임의로 지정하여 테스트 굳이 forward까지 구현하지 않아도 되므로 패스하고 진행한다. im..
2023.09.15 -
Pytorch) multioutput Regression 구현해보기
Pytorch에서 multioutput regression을 구현해보고자 한다. 구현하게 된 이유는 sckit-learn에서 RegressorChain이라는 것을 보고 도움이 될 것 같아서 해보려고 한다. 실제 구현된 코드를 보니 다음과 같이 구현이 되어 있었다. 구현된 방식은 Chain인 경우에 X에다가 y 예측값을 붙이고, 또 그것을 사용해서 다시 y를 예측하는 방식이었다. 이 부분을 참고해서 딥러닝이다 보니 약간은 다르게 구현을 해봤다. class _BaseChain(BaseEstimator, metaclass=ABCMeta): def __init__(self, base_estimator, *, order=None, cv=None, random_state=None): self.base_estimat..
2022.03.26 -
torchfunc) titanic data에 model parallel training 해보기
jax 예시로 나온 것처럼 소규모 네트워크를 빠르게 학습시키는 방법에 대해 공유합니다. 소규모 네트워크를 훈련하는 경우 병렬화의 근본적인 한계에 부딪힙니다. 확실히 2계층 MLP는 ResNet-50보다 훨씬 빠르게 실행됩니다. 그러나 ResNet에는 약 4B의 곱셈 누산 연산이 있는 반면 MLP에는 100K만 있습니다.1 우리가 원하는 대로 MLP는 ResNet보다 40,000배 더 빠르게 훈련하지 않으며 GPU 사용률을 검사하면 그 이유를 알 수 있습니다. . GPU의 ~100%를 사용하는 ResNet과 달리 MLP는 2-3%만 사용할 수 있습니다. 더 많은 컴퓨팅을 병렬로 사용하는 한 가지 방법은 배치 크기를 늘리는 것입니다. 예를 들어 128개 요소의 배치를 사용하는 대신 GPU를 채울 때까지 이를..
2022.03.26 -
Pytorch 1.11 이후) functorch 알아보기
22년 3월 14일 기준 현재까지는 Beta 버전입니다. Google JAX에서 크게 영감을 받은 functorch는 구성 가능한 함수 변환을 PyTorch에 추가하는 라이브러리입니다. PyTorch 모듈 및 PyTorch autograd와 함께 작동하는 구성 가능한 vmap(벡터화) 및 autodiff 변환을 우수한 eager-mode 성능으로 제공하는 것을 목표로 합니다. 구성 가능한 함수 변환은 오늘날 PyTorch에서 수행하기 어려운 여러 사용 사례에 도움이 될 수 있습니다. computing per-sample-gradients (or other per-sample quantities) running ensembles of models on a single machine efficiently b..
2022.03.14 -
Pytorch 1.11 이후) torchdata 알아보기
3월 14일 버전에서는 현재 Beta Stage이고 Stable하지 않다고 합니다. 개인적으로 tensorflow에서는 dataset이라는 기능을 통해 큰 데이터를 다 불러오지 않고, 부분적으로 불러오게 하는 기능이 있는데, torch 이전까지 버전에서는 그런 기능들을 제공하지 않아 아쉬웠는데, 이렇게 반가운 기능이 나와 공유합니다. What are DataPipes? 초기에 우리는 재사용 가능한 로딩 도구를 나타내는 PyTorch DataSet 사이의 광범위한 혼란을 관찰했다고 합니다. DataPipe는 단순히 합성된 사용을 위해 PyTorch DataSet의 이름을 바꾸고 용도를 변경하는 것입니다. DataPipe는 Python 데이터 구조에 대한 일부 액세스 함수, IterDataPipes의 경..
2022.03.14 -
pytorch 1.8.0 램 메모리 누수 현상 발견 및 해결
실험을 하다가 램을 확인하는데 엄청나게 많이 쌓이는 것을 확인하였다 memory_profiler로도 확인을 해보니 forward를 할 때마다 램이 계속 쌓이는 현상이 발견되서 이것 저것 실험을 해도 계속 같은 증상이 나왔다. 그래서 마지막으로 패키지 버전은 올려봤다 현재 21.12 월 기준 최신버전인 1.10.1+cpu 버전으로 진행하니 해결되었다. 앞으로 이런 버그가 있는 경우 최후의 수단으로 패키지를 업그레이드 혹은 다운그레이드 해보는 것도 좋아보인다 끝
2021.12.18 -
pytorch) dataloader sampler
OverSampler / StratifiedSampler 구현물 OverSampler는 다른 코드를 참고해서 수정해봤습니다. OverSampler from torch.utils.data import Sampler class OverSampler(Sampler): """Over Sampling Provides equal representation of target classes in each batch """ def __init__(self, class_vector, batch_size): """ Arguments --------- class_vector : torch tensor a vector of class labels batch_size : integer batch_size """ self.n_sp..
2021.04.19 -
[Pytorch] gather 함수 설명 (특정 인덱스만 추출하기)
우리가 자주 쓰는 방식은 위와 같은 방식이지만, 실제로 우리가 각각에 대해서 특정 인덱스를 뽑고자 하는 경우가 있다. 최근에 동료 연구원이 이것에 대해서 질문을 하였을 때, 즉각적으로 생각이 안 나서, 시간을 소비하였고, 유용하면서도 헷갈리는 것 같아 정리해보려고 한다. torch.gather(input, dim, index, out=None, sparse_grad=False) → TensorGathers values along an axis specified by dim. 위와 같이 특정 인덱스를 뽑으려고 하면 처음 접근 방식은 loop를 생각하지만, torch에서는 gather 함수를 제공하여 쉽게 indexing을 할 수 있다. 그리고 loop 방식은 차원이 커질 수록 일반화된 방식으로 처리하기가 ..
2021.03.17 -
PyGAD + Pytorch + Skorch+ torch jit
보호되어 있는 글입니다.
2021.01.30 -
[Pytorch] Error : Leaf variable has been moved into the graph interior 해결 방법 공유
torch에서 loss.backward()를 할 때 다음과 같은 에러를 경험을 했다 특정값에 inplace를 하게 되면 다음과 같은 에러가 생긴다. 필자는 아래와 같은 것이 loss에 들어가 있었다. ## 1 array[array==1] = 0.0 ## 2 array[idx] = logit 그래서 필자는 다음과 같이 여러개의 글을 보고 수정했다. 하나는 새로운 객체로 만드는 것이다 애는 단순히 개수를 세주는 역할이라서 해결됐다. array[array==1.0] = 1 count = array.sum() 두 번째는 torch.cat을 사용했다. (불확실!) 사용하지 않는 것과 사용하는 것들을 모아서 새로운 tensor를 만드니 작동했다. 물론 근데 update는 된 거지만 실제로 반영됐지는 아직 필요하다 ..
2021.01.16 -
[Pytorch] How to Apply the Weight Initialization (Code)
def weights_init(m): classname = m.__class__.__name__ if classname.find("Conv") != -1: nn.init.normal_(m.weight.data, 0.0, 0.02) elif classname.find("BatchNorm") != -1: nn.init.normal_(m.weight.data, 1.0, 0.02) nn.init.constant_(m.bias.data, 0) netD.apply(weights_init) docs.ray.io/en/master/tune/tutorials/tune-advanced-tutorial.html Guide to Population Based Training (PBT) — Ray v1.2.0.dev0 PBT ..
2020.12.17