Hello Computer Vision

데이터셋 동등하게 분리하기 본문

딥러닝/파이썬

데이터셋 동등하게 분리하기

지웅쓰 2024. 1. 28. 15:36

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개씩 빠진 것을 알 수 있다.