일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- shrinkmatch paper
- WGAN
- mme paper
- ConMatch
- tent paper
- GAN
- Pseudo Label
- 컴퓨터구조
- shrinkmatch
- UnderstandingDeepLearning
- mocov3
- conjugate pseudo label paper
- CoMatch
- semi supervised learnin 가정
- Entropy Minimization
- Pix2Pix
- SSL
- dann paper
- 최린컴퓨터구조
- BYOL
- cifar100-c
- remixmatch paper
- adamatch paper
- 딥러닝손실함수
- 백준 알고리즘
- CycleGAN
- dcgan
- CGAN
- Meta Pseudo Labels
- simclrv2
- Today
- Total
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 = [] #index들어갈 리스트
u_list = []
u_c_list = []
사전 세팅이다. cifar10 데이터셋은 이미 선언된 코드이다.
unlabeled_idx = np.array(range(len(labels)))[:25000] # 0~ 24,999
unlabeled_c_idx = np.array(range(len(labels)))[25000:] # 25,000 ~ 50,000
나 같은 경우 단순히 semi supervised 보다 corrupted 된 이미지가 들어갔을 때의 generalization을 얼마나 잘하는지에 관심이 있다. 따라서 corrupted된 이미지의 index들도 뽑아주어야 하므로 정의해주었다.
for i in range(num_classes):
idx = np.where(labels == i)[0] # 400개씩 고름
idx = np.random.choice(idx, label_per_class, replace = False)
labeled_idx.extend(idx) # 총 4,000개 들어가있음
for문을 통해 10번(클래스 개수)을 반복한다. 2번째 줄에서 [0]번 인덱스를 반환하는데 사용 이유는 다음과 같다. np.where함수는 튜플을 반환하기 때문에 0번 인덱스를 지정해주어야 우리가 원하는 index값을 받을 수 있다. 그리고 choice 함수에서 False는 복원추출 여부이다. 우리는 비복원추출을 해야하므로 False를 주었다. extend를 사용하는 이유는 append를 사용하면 array 자체를 담기 때문이다. extend를 사용하면 array안의 원소들을 차례차례 담는다.
for idx in labeled_idx:
if idx < 25000:
u_list.append(idx)
else:
u_c_list.append(idx)
이것은 내가 결과가 잘 나오는지 확인하고 싶어서 추가로 작성하는 코드이다.
labeled_idx = np.array(labeled_idx) #4,000개
unlabeled_c_idx = np.array(sorted(list(set(unlabeled_c_idx) - set(labeled_idx))))
unlabeled_idx = np.array(sorted(list(set(unlabeled_idx) - set(labeled_idx))))
np.random.shuffle(labeled_idx)
print(len(labeled_idx))
print(len(unlabeled_idx))
print(len(unlabeled_c_idx))
print(len(u_list))
print(len(u_c_list))
4000
22970
23030
2030
1970
결과를 다 작성해보자면 labeled idx는 총 4,000개 들어가있고, unlabeled idx에는 22970개, unlabeled_c_idx에는 23030개 들어가있는 것을 확인할 수 있다. 여기서 개수가 다른 이유는 위에서 코드를 보면 알겠지만 [:25,000], [25,000] 차이이다. 각각 25,000개씩의 index안에서 labeled 인덱스와 겹친다면 이를 제외해주는 것이다. 그래서 약 2,000개씩 빠진 것을 알 수 있다.
'딥러닝 > 파이썬' 카테고리의 다른 글
파이썬 copy, deepcopy 쓰는 이유 및 사용해보기 (0) | 2024.01.17 |
---|---|
[python] logging.getLogger(__name__) 선언 이유 (0) | 2023.12.24 |
[python] 튜플을 사용하는 이유 (0) | 2023.12.18 |
파이썬 getattr 알아보기 (0) | 2023.05.05 |
할당과 복사(얕은 복사, 깊은 복사) (0) | 2023.04.01 |