인프런 커뮤니티 질문&답변

minsubrother님의 프로필 이미지
minsubrother

작성한 질문수

처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 (쉽게! 기본부터 챗GPT 핵심 트랜스포머까지) [데이터분석/과학 Part4]

실제 캐글(Kaggle) 문제 풀고, 제출해보며, 성능 개선 기법 익히기3

Prepare dataset 부분에서 코드 오류가 납니다 ㅠㅠ

작성

·

385

0

첨부해주신 코드를 복사 붙여넣기 했는데, 오류가 나네요.. ㅠㅠ

오류명은 :

---> 21 class CustomDataset(Dataset):

22 def init(self, file_list, transform=None):

23 self.file_list = file_list

TypeError: str() argument 'encoding' must be str, not tuple

dataset_train = CustomDataset(train_list, transform=transforms_for_train)
dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test)
dataset_test = CustomDataset(test_list, transform=transforms_for_val_test)

CustomDataset 클래스를 통해, train, valid, test를 만들어주는 과정에서, str() arguments를 받아야 한다는 것 같은데.. 왜 오류가 나는지 잘 모르겠습니다.

from torchvision import transforms

input_size = 224
transforms_for_train =  transforms.Compose([
    transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)),
    transforms.RandomHorizontalFlip(),
    transforms.RandomVerticalFlip(),
    transforms.RandomRotation(10),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

transforms_for_val_test = transforms.Compose([
    transforms.Resize(input_size),
    transforms.CenterCrop(input_size),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

#class Dataset
class CustomDataset(Dataset):
    def __init__(self, file_list, transform=None):
        self.file_list = file_list
        self.transform = transform

    def __len__(self):
        return len(self.file_list)

    def __getitem__(self, idx):
        img_path = self.file_list[idx]
        if img_path.split('/')[-1][-3:] == 'jpg':
            img = Image.open(img_path)
            if self.transform is not None:
                img_transform = self.transform(img)
                label = img_path.split('/')[-1].split('.')[0]
                if label == 'dog':
                    label = 1
                elif label == 'cat':
                    label = 0
        return img_transform, label

dataset_train = CustomDataset(train_list, transform=transforms_for_train)
dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test)
dataset_test = CustomDataset(test_list, transform=transforms_for_val_test)

# from torch.utils.data import DataLoader # 데이터 로더 클래스
#
# train_batches = DataLoader(dataset=dataset_train, batch_size=8, shuffle=True)
# val_batches = DataLoader(dataset=dataset_valid, batch_size=8, shuffle=False)
# test_batches = DataLoader(dataset=dataset_test, batch_size=8, shuffle=False)

질문1).png강의 내용과 같이 len(train_list), len(val_list)가 잘 출력이 됨을 볼 수 있고, Reference 항목에서 특정 img의 사이즈를 출력해볼 떄도, (500, 374) 라고 잘 출력됨을 알 수 있었습니다.

train할 데이터와 test 데이터는 강의 중에 배운 os 명령어 및 with zip 명령어를 사용해서

질문3).png

<오류 화면 입니다.>

질문2).png

전체 작성한 코드 첨부드립니다.

import zipfile

Dataset = 'dogs-vs-cats-redux-kernels-edition'

with zipfile.ZipFile('../BecomeProfessional/' + Dataset + ".zip", "r") as z:
    z.extractall(".")
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
from PIL import Image
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, Subset
from torchvision import datasets, transforms
from sklearn.model_selection import train_test_split
from copy import deepcopy
import matplotlib.pyplot as plt
import os, shutil
import random
import os

#device 설정
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(device)

seed = 42 # seed값 설정
random.seed(seed) # 파이썬 난수 생성기
os.environ['PYTHONHASHSEED'] = str(seed) # 해시 시크릿값 고정
np.random.seed(seed) # 넘파이 난수 생성기

torch.manual_seed(seed) # 파이토치 CPU 난수 생성기
torch.backends.cudnn.deterministic = True # 확정적 연산 사용 설정
torch.backends.cudnn.benchmark = False # 벤치마크 기능 사용 해제
torch.backends.cudnn.enabled = False # cudnn 기능 사용 해제

if device == 'cuda':
    torch.cuda.manual_seed(seed)
    torch.cuda.manual_seed_all(seed)
original_data_path = './Dog_Cat/'
os.makedirs('dogsvscats', exist_ok=True)
import zipfile
with zipfile.ZipFile(os.path.join(original_data_path, 'train.zip')) as train_zip:
    train_zip.extractall('./Dog_Cat/dogsvscats')
with zipfile.ZipFile(os.path.join(original_data_path, 'test.zip')) as test_zip:
    test_zip.extractall('./Dog_Cat/dogsvscats')
import glob
print(glob.glob('./Dog_Cat/dogsvscats/train/*'))

출력: ./Dog_Cat/dogsvscats/train\\cat.11346.jpg', './Dog_Cat/dogsvscats/train\\cat.11347.jpg', './Dog_Cat/dogsvscats/train\\cat.11348.jpg', './Dog_Cat/dogsvscats/train\\cat.11349.jpg', ' .... (엄청 많이 출력됩니다)

train_dir = './Dog_Cat/dogsvscats/train'
test_dir = './Dog_Cat/dogsvscats/test'
all_train_files = glob.glob(os.path.join(train_dir, '*.jpg'))
test_list = glob.glob(os.path.join(test_dir, '*.jpg'))
train_labels = [path.split('/')[-1].split('.')[0] for path in all_train_files]
train_list, val_list = train_test_split(all_train_files, test_size=0.1, stratify=train_labels, random_state=seed)
print(len(train_list), len(val_list))

출력: 22500 2500

train_list[0]

출력: './Dog_Cat/dogsvscats/train\\cat.4814.jpg'

img = Image.open('./Dog_Cat/dogsvscats/train/cat.4814.jpg')
img.size

출력: (500, 374)

import IPython
image1 = IPython.display.Image(filename='./Dog_Cat/dogsvscats/train/cat.4814.jpg')
display(image1)


from torchvision import transforms

input_size = 224
transforms_for_train =  transforms.Compose([
    transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)),
    transforms.RandomHorizontalFlip(),
    transforms.RandomVerticalFlip(),
    transforms.RandomRotation(10),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

transforms_for_val_test = transforms.Compose([
    transforms.Resize(input_size),
    transforms.CenterCrop(input_size),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

#class Dataset
class CustomDataset(Dataset):
    def __init__(self, file_list, transform=None):
        self.file_list = file_list
        self.transform = transform

    def __len__(self):
        return len(self.file_list)

    def __getitem__(self, idx):
        img_path = self.file_list[idx]
        if img_path.split('/')[-1][-3:] == 'jpg':
            img = Image.open(img_path)
            if self.transform is not None:
                img_transform = self.transform(img)
                label = img_path.split('/')[-1].split('.')[0]
                if label == 'dog':
                    label = 1
                elif label == 'cat':
                    label = 0
        return img_transform, label

dataset_train = CustomDataset(train_list, transform=transforms_for_train)
dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test)
dataset_test = CustomDataset(test_list, transform=transforms_for_val_test)

오류 발생

질문2).png

답변 1

0

안녕하세요. 답변 도우미입니다.

사실 너무 코드가 길고, 에러만 봐서는 어디가 문제인지 바로 이해를 하기가 어려운데요. 또 해당 코드는 이미지 파일들과도 면밀히 연결되어 있어서, 바로 무엇이 잘못되었는지 알기가 어려운 것 같아요. 우선 어떤 파일인지도 파악이 쉽지 않은데요. 다음과 같은 저희가 드린 주피터 노트북 파일명등이실까요?

101_DOGS_VS_CATS_REDUX_KERNEL_ADVANCE_20220919_05439

해당 파일들은 모두 고성능을 요구해서, google colab 에 그대로 파일채로 업로드를 하신 후, 구글 colab 상에서 실행을 해보셔야 하는데요. 보여주신 코드화면을 보니, 구글 코랩이 아니고, 일반 에디터인 것 같아요.

제안드리는 방안은, 복사/붙여넣기도 많은 코드상 실수의 가능성이 있어서, 구글 코랩에 파일채로 업로드를 해서, 영상과 함께 개인별 설정이 필요한 부분을 재설정하셔서 해보시면 좋을 것 같습니다. 혹시 그래도 안되신다면, dream@fun-coding.org 로 메일로 설명해주시면, 다시 확인해보겠습니다.

감사합니다.

minsubrother님의 프로필 이미지
minsubrother

작성한 질문수

질문하기