일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 최린컴퓨터구조
- adamatch paper
- SSL
- 딥러닝손실함수
- tent paper
- remixmatch paper
- shrinkmatch paper
- dcgan
- conjugate pseudo label paper
- dann paper
- Entropy Minimization
- CGAN
- WGAN
- simclrv2
- GAN
- UnderstandingDeepLearning
- BYOL
- 백준 알고리즘
- CoMatch
- ConMatch
- 컴퓨터구조
- cifar100-c
- CycleGAN
- semi supervised learnin 가정
- Meta Pseudo Labels
- shrinkmatch
- Pseudo Label
- Pix2Pix
- mocov3
- mme paper
- Today
- Total
목록전체 글 (247)
Hello Computer Vision
semi supervised learning을 공부하면은 labeled 데이터가 몇개가 있냐에 따라 성능이 달라진다. 따라서 dataset에서 labeled데이터 개수에 맞추어 분리하는 과정이 필요하다. cifar10 데이터셋을 사용하고 labeled 데이터가 4,000개 있을 때의 setting의 예시이다. num_labels = 4000 #labeled 데이터 개수 num_classes = 10 # class 개수 labels = cifar_dataset.targets # list로 되어있다 labels = np.array(labels) # array 로 변경해준다 label_per_class = num_labels // num_classes #클래스별 데이터 개수 labeled_idx = [] #i..
우선 직관적으로 코드만 보여주면 다음과 같다. layout = {'Loss' :{ 'loss':['Multiline', ['loss/label', 'loss/unlabel', 'loss/unlabel_c', 'loss/aux']] }} writer.add_custom_scalars(layout) 이렇게 layout을 저장하고 writer.add_scalar('loss/label', Lx, epoch+1) writer.add_scalar('loss/unlabel', Lu, epoch + 1) writer.add_scalar('loss/unlabel_c', Lu_c, epoch + 1) writer.add_scalar('loss/aux', Laux, epoch + 1) 값들을 다음과 같이 저장하면 된다. 그..
2개의 동일 모델이 있고 한개는 이미 학습이 어느 정도 됐고 다른 1개는 초기화 상태이다. 학습이 어느 정도 된 모델의 파라미터를 안된 모델의 가중치로 넘겨주고, 이 모델에 대해서 학습을 시킨다. 그렇다면 기존 넘겨준 모델의 가중치는 업데이트가 될까? 직관적으로는 안될 거 같지만 실험을 해봤다. import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F x_train = torch.FloatTensor([[1], [2], [3]]) y_train = torch.FloatTensor([[2], [4], [6]]) layer = nn.Linear(1, 1) layerc = nn.Linear(1, 1..
이번에 실험하면서 CIFAR10-C 데이터셋을 다루게되었는데 시행착오도 많아가지고 공유해보려고 한다. 우선 https://zenodo.org/records/2535967 사이트에서 CIFAR10-C 데이터 다운로드 링크를 복사 후 터미널에 wget {dataest link} 를 하면된다. colab환경이라면 !wget하면 된다 그렇다면 tar를 확장자로 하는 압축파일을 다운로드 받게 되는데 압축을 푸는데 다양한 방법이 있지만 import tarfile tar = tarfile.open('/content/CIFAR-10-C.tar?download=1', 'r') tar.extractall() tar.close() 이렇게 한다면 압축 파일을 해제할 수 있다(위 환경은 colab환경이다) 그렇다면 이렇게 많은..
모델을 훈련 전에 복사할 필요성이 생겼는데 이번 기회에 copy, deepcopy를 비교해보려고 한다. 1. 다른 변수로 할당 우선 코딩 초보인 나에게 해당 변수 값을 다른 변수에 넘겨주면은 되지 않나 생각을 했다. a = [1,2,3] b = a a.append(4) print(f'a: {a}, 주소 : {id(a)}') print(f'b: {b}, 주소 : {id(b)}') a: [1, 2, 3, 4], 주소 : 2603786361344 b: [1, 2, 3, 4], 주소 : 2603786361344 이렇게 다른 변수를 사용하더라도 기존 변수에 대한 참조를 하기 때문에 값이 같이 변하는 것을 확인할 수 있고 메모리 주소도 같은 것을 확인할 수 있다. 이렇게 새로운 변수 생성하는 방법을 왜 사용하는지에..
데이터셋을 다루다보면은 cat, stack을 사용하는 코드들이 종종 있는데 이를 구분하기 위해 정리하려고 한다. 우선 코드로 먼저 확인하는게 제일 빠를 거 같다. x = torch.rand(3, 5) y = torch.rand(3, 5) a = torch.cat([x, y], dim = 0) b = torch.stack([x, y], dim = 0) print(a.shape) print(b.shape) torch.Size([6, 5]) torch.Size([2, 3, 5]) 결과로 보는 것처럼 torch.cat을 사용한다면 지정해준 dim에 텐서들을 붙이는 것을 확인할 수 있다. 그러나 torch.stack을 사용한다면 새로운 차원에서 텐서들을 붙이는 것을 확인할 수 있다.
TTT에서는 SSL을 활용해 이미지를 rotate시키고 classifier 가 방향을 맞추도록 해 encoder를 추가로 훈련시킨다. 이를 따로 증강을 활용하는 것이 아니라 tensor들의 위치를 바꿔준다. def tensor_rot_90(x): return x.flip(2).transpose(1, 2) plt.figure(figsize=(8, 8)) for i in range(8): # 원본 이미지 plt.subplot(8, 2, 2 * i + 1) plt.imshow(np.transpose(images[i].numpy(), (1, 2, 0))) plt.axis('off') # 90도 회전 이미지 rotated_image = tensor_rot_90(images[i]) plt.subplot(8, 2, ..
Pytorch를 사용하다보면은 detach가 쓰이는 코드를 종종만난다. 사실 이 전까지는 gradient에 대해서 별 생각이 없었다. 그런데 요즘 실험 및 논문을 읽으면서 gradient에 대한 이야기가 많이 나와 조금 정리해보려고 한다. 나는 detach를 사용하면 해당 데이터의 gradient를 사용하지 않는 것으로 알고 있었다. import torch import torch.nn as nn class TestModel(nn.Module): def __init__(self): super().__init__() self.layer1 = nn.Linear(10, 10) self.layer2 = nn.Linear(10, 10) self.layer3 = nn.Linear(10, 10) def forward(..