일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- classification
- Python
- 자료구조
- 머신러닝
- 딥러닝
- SSL
- Vision
- GAN
- algorithm
- web
- Torch
- Front
- nlp
- computervision
- ML
- pytorch
- nerf
- 알고리즘
- math
- clean code
- REACT
- Meta Learning
- Depth estimation
- CV
- FineGrained
- FGVC
- dl
- PRML
- cs
- 3d
- Today
- Total
목록Python/Pytorch (10)
KalelPark's LAB
Pytorch unfold란? Batched tensor에 대하여, 마치 Convolution처럼, Slidingg하면서, locl block을 구하는 것이다. 예를들면, 해당 MNIST의 경우 1, 1, 28, 28 사이즈의 경우 -> 1, 49, 16 으로 변환한 것이다. EX) import torch.nn as nn from matplotlib import pyplot as plt from torchvision import datasets, transforms if __name__ == '__main__': train_data = datasets.MNIST(root='./data/', train=True, download=True, transform=transforms.ToTensor()) test..
Pytorch에서 CUDA 호출은 asynchronize이기 때문에, 코드를 동기화 해줘야 합니다. 시간을 측정할 때, 사용됩니다. torch.cuda.Event()는 device의 progress를 모니터링하는데 사용할 수 있는 synchronization markers입니다. -> CUDA stream 내부 명령 흐름 중 특정 지점에 표시를 남기는 것입니다. 정확하기 시간을 측정하고자 한다면, synchronize를 해야한다고, 공식 문서에서 언급했습니다. 이벤트가 처음 record되거나, 다른 프로세스를 내보낼 때, 기본 CUDA 이벤트가 느리게 초기화 됩니다. 생성 후에는 동일한 장치의 stream만 event로 기록할 수 있습니다. 그러나 모든 장치의 stream은 이벤트를 기다릴 수 있습니다...
Pytorch에서의 Distributed Package 사용하기 - 규모가 큰 모델을 학습할 때는, 보통 분산 학습을 진행합니다. Multi-GPU 학습을 할 때, 분산 학습을 사용할 수 있습니다. 직접 구현할 수도 있지만, Pytorch에서 제공하는 기능을 사용합니다. - 아래의 코드는 ImageNet1K를 돌리는 경우를 보여줍니다. https://github.com/pytorch/examples/blob/main/imagenet/main.py main_worker에서 dist.init_process_group을 통하여, GPU마다 분산 학습을 위해서 초기화를 진행합니다. torch docs에 따르면, multi-gpu시, backend를 nccl로 설정하라고 되어 있습니다. DistributedDat..
매번 까먹어서, 다시 다듬어보고자 한다. torch.gather란? 공식문서에 따르면 차원에 해 정해진 축에 따라 값을 모읍니다. import torch t = torch.tensor([[1, 2], [3, 4]]) torch.gather(t, 1, torch.tensor([[0, 0], [1, 0]])) 즉, 차원에 따라 값을 재배치한다고 이해하면 됩니다. * 코드로 한번 더 이해해보도록 하겠습니다. out[i][j][k] = input[index[i][j][k]][j][k] out[i][j][k] = input[i][index[j][k]][k] out[i][j][k] = input[i][j][index[k]] // 위의 값처럼 indexing이 처리되는 것을 알 수 있습니다. Example> imp..
Split란? Split의 경우 데이터당 최대 자료구 N개를 가지게 하는 방법입니다. 만약 원하고자 하는 split_size로 나누고자 하지만, 정확한 size로 나누는 것이 불가능하다면, 마지막 size는 작습니다. Chunk란? chunks의 경우 데이터를 n개로 나누는 방법입니다. chunk의 경우 n개의 그룹을 만드는 것이다. * 쉽게 이해하고자 한다면, chunk는 n개의 그룹을 만드는 것이고, split의 경우 n개로 구성된 그룹을 만드는 것이다.
Data Sampler는 주어진 Data Pool과 batchsize에서 어떻게 batch를 형성할지 결정해주며, Dataset의 순서를 결정하는 역할을 하기도 합니다. DataLoader가 초기화될 때, 데이터셋의 샘플들의 Sequence Order를 작성한다. 만들어진 Sequence를 통하여, 데이터셋에서 데이터들이 주어진 Batchsize만큼 batch의 형태로 나오게 됩니다. Sampler에는 여러가지가 존재합니다. - Random Sampler : 랜덤, replacement 여부 선택 가능, 개수 선택 가능 - SubsetRandom Sampler : 랜덤 리스트, 위와 두 조건 불가능 - Sequential Sampler : 항상 같은 순서 - Custom Sampler (Weight) :..
meshgrid - 각각의 원소가 scalar 또는 1 dimensional vector인 N개의 tensor를 받아, N개의 N dimensional grid를 만듭니다. i번째 grid는 i번째 input을 다른 input으로 정의된 차원만큼 확장한 것이다. import torch x = torch.tensor([1, 2, 3]) y = torch.tensor([4, 5, 6]) grid_x, grid_y = torch.meshgrid(x, y, indexing = "xy") print(grid_x) print(grid_y) >> tensor([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) >> tensor([[4, 4, 4], [5, 5, 5], [6, 6, 6]]) grid_x, g..
Logsumexp - 지정된 차원 dim으로부터, 입력 텐서의 각 행에 대한 합계 지수 로그를 반환합니다. 이후, 계산은 수치적으로 안정화 됩니다. 사용하는 이유? - 매우 작은 양수나 매우 큰수를 나타내는 한 가지 방법으로는 Log를 활용하는 것이다. 하지만, 덧셈은 약간의 trick이 필요하다. (LogSumExp Trick이 필요합니다.) 두 큰 수 Exp(800) 와 Exp(900)을 더하고자 한다. 문제는, Log에서 덧셈은 곱셈처럼 간단하지 않습니다. (컴퓨터에서 정확하게 나타내는 것이 불가능합니다.) 그리하여, 각각의 큰 2개의 수를 2개의 수 중 최소 값으로 각각의 수를 나누고, 다시 2개의 수를 더한 후 log를 취한 다음, 이전에 나눈 최소 값을 더해주면 된다. - 이러한 방식을 활용하..