PyTorch 加载超大 Libsvm 格式数据
生活随笔
收集整理的這篇文章主要介紹了
PyTorch 加载超大 Libsvm 格式数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于比較大的數據集,比如好幾個T的數據,沒有辦法一次性全部加載進內存,因此需要構建一個可迭代的數據集IterableDataset。
迭代讀取文本文件
要借助pytorch的IterableDataset模塊,官方文檔是:IterableDataset。
按照官網的說法,需要繼承這個IterableDataset類,然后覆寫__iter__這個方法,返回一個可迭代的對象即可。
因為我們要處理的時標準 Libsvm 格式數據,所以還需要實現又給process_line函數處理每一行數據。
class LibsvmDataset(IterableDataset):def __init__(self, file_path, n_features):"""file_path: Libsvm格式數據文件地址n_features: 特征數,從1開始"""self.file_path = file_pathself.n_features = n_featuresdef process_line(self, line):line = line.split(' ')label, values = int(line[0]), line[1:]value = torch.zeros((self.n_features))for item in values:idx, val = item.split(':')value[int(idx) - 1] = float(val)return label, valuedef __iter__(self):with open(self.file_path, 'r') as fp:for line in fp:yield self.process_line(line.strip("\n"))然后我們就可以直接把LibsvmDataset通過DataLoader封裝成一個加載器。
dataset = LibsvmDataset("./test.libsvm", 10) dataloader = DataLoader(dataset, batch_size=3) for data in dataloader:print(data)Shuffle 操作
如果說想實現shuffle操作的話,可以手動增加一個緩沖池,然后隨機抽取。
class LibsvmDataset(IterableDataset):def __init__(self, file_path, n_features, buffer_size=256):"""file_path: Libsvm格式數據文件地址n_features: 特征數,從1開始"""self.file_path = file_pathself.n_features = n_featuresself.buffer_size = buffer_sizedef process_line(self, line):line = line.split(' ')label, values = torch.tensor([int(line[0])], dtype=torch.float), line[1:]value = torch.zeros((self.n_features), dtype=torch.float)for item in values:idx, val = item.split(':')value[int(idx) - 1] = float(val)return value, labeldef __iter__(self):shuffle_buffer = []with open(self.file_path, 'r') as fp:index = 0for line in fp:shuffle_buffer.append(self.process_line(line.strip("\n")))index += 1if index > self.buffer_size:breakwith open(self.file_path, 'r') as fp:for line in fp:evict_idx = random.randint(0, self.buffer_size - 1)yield shuffle_buffer[evict_idx]shuffle_buffer[evict_idx] = self.process_line(line.strip("\n"))總結
以上是生活随笔為你收集整理的PyTorch 加载超大 Libsvm 格式数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode Algorithm 面
- 下一篇: 2019年第十届蓝桥杯 - 省赛 - C