SK Networks Family AI bootcamp 강의노트

24일차 [ Loading Dataset (중요한 내용) ]

HyunJung_Jo 2025. 2. 18. 16:33
오늘은 아침부터 좀 달렸더니 15분 컷했다. 앞으로 조금씩 뛰는 시간을 줄여나갈 생각이다.
그리고 공부했던 것 중 모르는 거를 정리해나갈거다. 넋이 나가거나 인스타할 시간에 숨 좀 크게 쉬고 하루, 이틀치씩 잠깐 잠깐씩 핵심어만 뽑아보고 그걸 상세설명으로 조금씩 이해해 나갈거다. 
또 오늘은 토이 프젝에서 맡았던 API KEY 관리를 UI상에서 어떻게 하는 지도 cursor ai로 해결해볼거다.

https://colab.research.google.com/drive/1zjOSxjWQ09sK6FOU-fJ7isryTgaijpg4#scrollTo=DYodSamweDYp

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

1. 임포트 및 설정: 이 노트북은 데이터 처리, 시각, PyTorch를 사용한 딥러닝 위해 필요한 라이브러리를 임포트합니다numpytorchtorchvisionmatplotlib 등이 포함됩니다.

2. FashionMNIST 데이터셋 로: torchvision.datasets.FashionMNIST 사용하여 FashionMNIST 데이터셋을 로드합니다. 데이터셋  테스트으로 , 이미지를 서로 변환하는 환이 적용됩니다.

3. 데이터 탐색: 데이터셋의 타입, 크기를 확인하고, 랜덤 샘플과 레이블을 시각화하여 탐색합니다.

4. DataLoader 사용: DataLoader를 사용하여 데이터셋을 배치로 나누고, 셔플하며, 반복합니다. 배치의 형태가 올바른지 확인합니다.

5. ImageFolder 데이터셋: Google Drive에 연결하여 피자, 스테이크, 스시 이미지로 구성된 커스텀 데이터셋에 접근하고, torchvision.datasets.ImageFolder를 사용하여 로드합니다. 이 데이터셋도 FashionMNIST와 유사하게 탐색합니다.

6. 커텀 데이터셋 클래스: torch.utils.data.Dataset 상속받아 커스텀 데이터셋 클래스를 생성합니다. 이 클래스는 이미지가 클래스 이름으로 된 디렉토리에 저장 데이터셋을 처리하도록 설계되었습니다.

7. DataFrame 데이터셋 클래스: Pandas DataFrame을 사용하여 테이블 형식의 데이터를 처리하기 위한 또 다른 텀 데이터셋 클래스를 생성합니다. 이는 Seaborn의 Titanic Tips 데이터셋을 위해 설계되었습니다.

 

데이터셋 만들기

#### FashionMNIST 로드
```python
training_data = datasets.FashionMNIST(
    root='fashion_data',
    train=True,
    download=True,
    transform=ToTensor()
)

test_data = datasets.FashionMNIST(
    root='fashion_data',
    train=False,
    download=True,
    transform=ToTensor()
)
```
### 랜덤 샘플 시각화	
figure = plt.figure(figsize=(8,8))
cols, rows = 3, 3

for i in range(1, cols * rows +1):
    rand_sample_idx = torch.randint(len(training_data), size=(1,)).item()
    img, label = training_data[rand_sample_idx]
    figure.add_subplot(rows, cols, i)
    plt.imshow(img, cmap="gray")
    plt.title(labels_map[label])
    plt.axis("off")

plt.show()
### 커스텀 데이터셋 클래스
class CustomDataset(Dataset):
    def __init__(self, data_path:str, transform=None):
        self.transform = transform
        self.lst_path = list(Path(data_path).glob('*/*.jpg'))
        self.index_to_class = self.__get_classes(data_path)
        self.class_to_index = {class_name: i for i, class_name in enumerate(self.index_to_class)}

    def __get_classes(self, data_path):
        return sorted(entry.name for entry in os.scandir(data_path) if entry.is_dir())

    def __len__(self) -> int:
        return len(self.lst_path)

    def __getitem__(self, index:int):
        feature_path = self.lst_path[index]
        img = Image.open(feature_path)
        target_name = feature_path.parent.stem

        if self.transform:
            img = self.transform(img)

        return img, self.class_to_index[target_name]
### DataFrame 데이터셋 클래스
class DfDataset(Dataset):
  # 데이터 길이
  def __init__(self,df,target_name,transform=None):
    # 생성 함수의 특징: 딱 한번만 실행!
    # self.df = df
    # self.target_name= target_name
    self.transform = transform
    self.features_df = df.drop(target_name,axis=1)
    self.target_df = df[target_name]

  def __len__(self):
    return len(self.df)
  # 인덱스 이용, feature, target 추출

  def __getitem__(self,idx):
    # feature은 survived을 제외한 컬럼
    # target은 survived
    # features = self.df.iloc[idx].drop(self.target_name)
    # target = self.df.iloc[idx][self.target_name]
    features = self.features_df.iloc[idx]
    target = self.target_df.iloc[idx]

    if self.transform is not None:
      features = self.transform(features)
    return features, target
    
data = sns.load_dataset("titanic")
df_dataset = DfDataset(data,'survived')
len(df_dataset)
feature,data = df_dataset[0]
feature,data

Remind

  • shuffle은 시계열 데이터에선 하면 안됨
  • 폴더명이 타겟 이름으로 되어있어야 한다.
  • os.walk: 모든 디렉토리 다 돌아다니면서 볼 때
  • path_to_target.parent.stem
  • 이미지 전처리: transform
  • next(iter()) = for문 (for f,t in l = f,t == next(iter(l)) )
  • magic method는 별도로 만들어야 한다.