Pytorch의 데이터 처리 (Dataset / Dataloader)

Devlee247·2021년 10월 14일
1

Pytorch의 데이터와 관련된 Dataset / Dataloader

개요

데이터를 처리하는 코드는 지저분하고, 유지보수를 하는데에 어려움이 있을 수 있다. 따라서 더 나은 가독성(readability)모듈성(modularity)를 위하여 데이터셋과 관련된 코드를 학습 코드와 분리하는 것이 이상적이다.

Pytorch는 torch.utils.data.DataLoader와 torch.utils.data.Dataset의 두가지 데이터 기본 요소를 제공한다. (레퍼런스 사이트 :https://pytorch.org/docs/stable/data.html)

이 두가지를 이용해 기존에 Pytorch가 가지고 있던 데이터셋을 사용하거나, 개인이 가지고 있는 데이터셋을 편리하게 사용할 수 있도록 도와준다.

본 게시글에서는 개인의 .csv 파일 데이터를 이용하여 pytorch에서 사용가능하도록 Dataset을 만드는 내용을 넣으려 한다.

Dataset : csv파일을 이용하여 사용자 정의 데이터셋 만들기

사용자가 직접 정의한 Dataset 클래스는 반드시 init, len, getitem 3개 함수를 구현해야 한다.

class CustomDataset(Dataset):
	def __init__(self):
	# 생성자, 데이터를 전처리 하는 부분	

	def __len__(self):
	# 데이터셋의 총 길이를 반환하는 부분	

	def __getitem__(self,idx):
	# idx(인덱스)에 해당하는 입출력 데이터를 반환한다.

다음은 판다스를 이용하여 csv파일을 불러오고, 불러온 파일에 맞춰서 3개 함수를 구현하는 코드이다. 이 부분을 수정하여 Train 전용으로 데이터 셋을 추출하거나, Prediction 전용으로 데이터 셋을 추출할 수 있다.

import pandas as pd

class CustomDataset(Dataset):
	def __init__(self, csv_path):
		df = pd.read_csv(csv_path)
		# df.shape : (1314,16)
		
		# df.iloc을 통해 슬라이싱 하는 과정 혹은 reshapes하는 과정은 csv 파일의 구성에 따라 다르다.
		# 해당 데이터는 2번째 index부터 parameters이고,
		# 1번째 index가 label이기에 다음처럼 코드를 구성하였다.
		self.inp = df.iloc[:, 2:].values
		self.outp = df.iloc[:,1].values.reshapes(1314,1)
	
	def __len__(self):
		# 가지고 있는 데이터셋의 길이를 반환한다.
		return len(self.inp) # 1314

	def __getitem__(self,idx):
		inp = torch.FloatTensor(self.inp[idx])
		outp = torch.FloatTensor(self.outp[idx])
		return inp, outp # 해당하는 idx(인덱스)의 input과 output 데이터를 반환한다.

DataLoader를 활용하여 Dataset 사용하기

개인적인 생각으로는 사용자가 함수를 지정하여 커스텀으로 자신만의 Dataset을 만들면, DataLoader는 Dataset의 함수인 len, getitem 등 함수를 이용하여 원하는 index에 접근하거나 iterator 형식으로 데이터를 쉽게 순회할 수 있도록 도와주는 것 같다. 또한 더욱 손쉽게 batch_size나 shuffle 유무를 설정할 수 있다.

다음은 csv_path를 이용하여 CustomDataset을 생성하고, DataLoader를 활용하는 코드이다.

# 본인의 환경에 맞춰서 csv 경로를 입력하면 된다.
CSV_PATH = './test.csv'
EPOCHS = 20

dataset = CustomDataset(CSV_PATH)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

for epoch in range(EPOCHS + 1):
	for batch_idx, samples in enumerate(dataloader):
		x_train, y_train = samples.values()

이렇게 x_train, y_train을 batch_size에 맞춰서 불러왔으니, 이를 이용해서 train을 하거나 predict를 하면된다.

이외에도 필요한 옵션 등이 있다면 적극적으로 pytorch docs를 활용하자.

출처 :
https://pytorch.org/docs/stable/data.html
https://tutorials.pytorch.kr/beginner/basics/data_tutorial.html
https://wikidocs.net/57165

profile
항상 긍정적인 마음으로 배움을 갈망하며, 운동과 음악을 사랑하는 개발자

1개의 댓글

comment-user-thumbnail
2022년 3월 10일

안녕하세요 포스트 잘 읽었습니다! 좋은 글 써주셔서 감사합니다.
제가 이쪽 방면으론 처음 시작해서 아직 모르는 부분이 많아 질문하나 드리려고합니다ㅠㅠ
혹시 읽어들일 csv데이터가 여러개일때는 어떤 방식으로 데이터로더를 구성하면 좋을까요?
(시계열데이터분류를 위해 이미지처럼 여러가지 케이스를 csv파일로 분류시켜놨습니다.)
ex) case1_01~case1_100,,,처럼 case1에서 case6까지 분류시켰습니다.

답글 달기