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.DataLoaderDataset 에 대한 동작 을 제공 합 니 다.동작 은 다음 과 같 습 니 다.
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])
결 과 는 그림 과 같다.이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정확도에서 스케일링의 영향데이터셋 스케일링은 데이터 전처리의 주요 단계 중 하나이며, 데이터 변수의 범위를 줄이기 위해 수행됩니다. 이미지와 관련하여 가능한 최소-최대 값 범위는 항상 0-255이며, 이는 255가 최대값임을 의미합니다. 따...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.