Pytorch tensor.save() 为来自 MNIST 的小张量生成大文件

Pytorch tensor.save() produces huge files for small tensors from MNIST

我正在使用来自 Kaggle challange 的 MNIST 数据集,但在数据预处理方面遇到了问题。此外,我不知道什么是最佳做法,想知道您是否可以就此向我提供建议。

免责声明:我不能只使用torchvision.datasets.mnist因为我需要使用Kaggle的数据进行训练和提交。

this教程中,建议创建一个从文件加载.pt张量的数据集对象,以充分利用GPU。为了实现这一点,我需要加载 Kaggle 提供的 csv 数据并将其保存为 .pt 文件:

import pandas as pd
import torch
import numpy as np

# import data
digits_train = pd.read_csv('data/train.csv')

train_tensor = torch.tensor(digits_train.drop(label, axis=1).to_numpy(), dtype=torch.int)
labels_tensor = torch.tensor(digits_train[label].to_numpy()) 

for i in range(train_tensor.shape[0]):
    torch.save(train_tensor[i], "data/train-" + str(i) + ".pt")

每个train_tensor[i].shapetorch.Size([1, 784])

但是,每个这样的 .pt 文件的大小约为 130MB。 具有随机生成的整数的相同大小的张量的大小为 6.6kB。 为什么这些张量这么大,我怎样才能减小它们的大小?

数据集是 42 000 个样本。我是否应该费心批量处理这些数据?我是否应该费心将张量保存到单独的文件中,而不是将它们全部加载到 RAM 中然后分批处理?这里的最佳方法是什么?

this discussion 中所述,torch.save() 保存整个张量,而不仅仅是切片。您需要使用 clone().

显式复制数据

别担心,在运行时数据只会分配一次,除非您明确创建副本。

作为一般性建议:如果数据很容易放入您的记忆中,请立即加载。对于 130 MB 的 MNIST,情况确实如此。

但是,我仍然会批处理数据,因为它收敛得更快。查看SGD的优势了解更多详情。