pytorch load huge dataset 해결(빅 데이터 로드)

문제.
최근 pytorch 로 실험 을 하 다가 대량의 데 이 터 를 불 러 오 는 문제 가 발생 했 습 니 다.실험 데이터 의 크기 는 400 Gb 이 고,자체 기계 의 memory 는 256 Gb 에 불과 하 며,분명히 데 이 터 를 한 번 에 memory 에 전부 로드 할 수 없다.
해결 방법
먼저 MyDataset 계승 torch.utils.data.dataset 를 사용자 정의 한 다음 MyDataset 대상 feed in torch.utils.data.dataLoader()를 사용 하면 됩 니 다.
MyDataset 는init__파일 대상 을 설명 하고getitem__데 이 터 를 천천히 읽 으 면 한 번 에 모든 데 이 터 를 메모리 에 불 러 오지 않 습 니 다.훈련 데 이 터 는 train.txt 에 저장 되 어 있 으 며,줄 마다 데이터 기록 이 있 습 니 다.

import torch.utils.data as Data
from tqdm import tqdm
class MyDataset(Data.Dataset):
	def __init__(self,filepath):
		number = 0
		with open(filepath,"r") as f:
			#           
			for _ in tqdm(f,desc="load training dataset"):
				number+=1
		self.number = number
		self.fopen = open(filepath,'r')
	def __len__(self):
		return self.number
	def __getitem__(self,index):
		line = self.fopen.__next__()
		#    transform()          
		data = transform(line)
		return data

train_dataset = MyDataset(filepath = "train.txt")
training_data = Data.DataLoader(dataset=train_dataset, batch_size=32,num_workers=1)
주의 하 다.
1、num_workers 는 1 로 만 설정 할 수 있 습 니 다.MyDataset 초기 화 시 파일 대상 이 하나 밖 에 없 기 때문에 dataloader 시 numworkers=1 파일 대상 이 데 이 터 를 읽 는 데 한 라인 만 사용 합 니 다.하면,만약,만약...workers>1,오류 가 발생 할 수 있 습 니 다.여러 스 레 드 가 같은 파일 대상 을 동시에 조작 합 니 다.얻 은 데 이 터 는 원 하 는 것 이 아 닙 니 다.
2.모든 epoch 가 끝 난 후에 train 을 다시 성명 해 야 합 니 다.dataset 와 trainingdata。하나의 epoch 가 끝 난 후에 파일 대상 이 파일 의 끝 을 가리 키 기 때문에 다음 epoch 에서 데 이 터 를 가 져 올 때 아무것도 얻 을 수 없습니다.
3、여기 때문에getitem__()파일 에서 한 줄 을 순서대로 꺼 내 는 것 일 뿐 index 와 는 무관 합 니 다.DataLoader 에 서 는 인자 shuffle 이 True 로 지정 되 더 라 도 얻 은 데 이 터 는 순서 입 니 다.즉,이 방법 은 shuffle 데 이 터 를 사용 할 수 없습니다.
추가:Pytorch 에서 자신의 데이터 세트 를 불 러 옵 니 다(DataLoader 로 Dataset 읽 기)
1.우 리 는 Pytorch 가 데 이 터 를 불 러 오고 공식 적 으로 정 리 된 데이터 세트 를 사용 하 는 것 을 자주 볼 수 있다.
데이터 세트 를 불 러 올 때 가 많 습 니 다.이 럴 때 Dataset 과 DataLoader 를 사용 해 야 합 니 다.
Dataset:DataLoader 에 봉 인 된 것 으로 데이터 와 라벨 을 봉 인 했 습 니 다.
DataLoader:DataLoaderIter 에 봉 하여 데이터 구분 을 실현 합 니 다.
2.Dataset
원본 코드 를 읽 은 후에 우 리 는 이 방법 을 계승 하려 면 반드시 두 가지 방법 을 실현 해 야 한다 고 지도 할 수 있다._getitem_() _len_()따라서 실현 과정 에서 우 리 는 다음 과 같이 테스트 한다.

import torch
import numpy as np

#   GetLoader ,  Dataset  ,   __getitem__() __len__()  
class GetLoader(torch.utils.data.Dataset):
	#      ,    
    def __init__(self, data_root, data_label):
        self.data = data_root
        self.label = data_label
    # index   batchsize          ,   data    labels      
    def __getitem__(self, index):
        data = self.data[index]
        labels = self.label[index]
        return data, labels
    #            ,   DataLoader    ,       ,DataLoader     
    def __len__(self):
        return len(self.data)

#       ,   10 * 20 
source_data = np.random.rand(10, 20)
#       ,   10 * 1 
source_label = np.random.randint(0,2,(10, 1))
#   GetLoader       ,  Dataset  ,  data labels
torch_data = GetLoader(source_data, source_label)
3.DataLoader
Dataset 에 대한 동작 을 제공 합 니 다.동작 은 다음 과 같 습 니 다.

torch.utils.data.DataLoader(dataset,batch_size,shuffle,drop_last,num_workers)
매개 변수의 의 미 는 다음 과 같다.
dataset:torch.utils.data.dataset 대상 데이터 불 러 오기
batch_크기
shuffle:데 이 터 를 흐 트 러 뜨 릴 지 여부
drop_last:제거 할 수 없 는 마지막 datasize 를 버 릴 지 여부
num_workers:불 러 올 때 하위 프로 세 스 수 를 표시 합 니 다.
따라서 실현 과정 에서 우 리 는 다음 과 같이 테스트 한다.

from torch.utils.data import DataLoader

#     
datas = DataLoader(torch_data, batch_size=6, shuffle=True, drop_last=False, num_workers=2)
이때 우리 의 데 이 터 는 이미 불 러 왔 으 니 훈련 과정 에서 만 사용 하면 된다.
4.데이터 보기
우 리 는 교체 기(enumerate)를 통 해 데 이 터 를 출력 할 수 있 습 니 다.테스트 는 다음 과 같 습 니 다.

for i, data in enumerate(datas):
 # i     batch, data   batch     ,  data    labels
    print("  {}  Batch 
{}".format(i, data))
출력 결 과 는 다음 그림 과 같 습 니 다:

결과 설명:데이터 가 10 개 이기 때문에 batchsize 크기 는 6 이 고 droplast=False 이 므 로 첫 번 째 크기 는 6 이 고 두 번 째 크기 는 4 입 니 다.모든 batch 에는 data 와 대응 하 는 labels 가 포함 되 어 있 습 니 다.
data 와 대응 하 는 labels 를 꺼 내 려 면 다음 표 만 사용 하면 됩 니 다.테스트 는 다음 과 같 습 니 다.

#       
print(data[0])
#       
print(data[1])
결 과 는 그림 과 같다.
在这里插入图片描述
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기