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].shape
是torch.Size([1, 784])
但是,每个这样的 .pt 文件的大小约为 130MB。
具有随机生成的整数的相同大小的张量的大小为 6.6kB。
为什么这些张量这么大,我怎样才能减小它们的大小?
数据集是 42 000 个样本。我是否应该费心批量处理这些数据?我是否应该费心将张量保存到单独的文件中,而不是将它们全部加载到 RAM 中然后分批处理?这里的最佳方法是什么?
如 this discussion 中所述,torch.save()
保存整个张量,而不仅仅是切片。您需要使用 clone()
.
显式复制数据
别担心,在运行时数据只会分配一次,除非您明确创建副本。
作为一般性建议:如果数据很容易放入您的记忆中,请立即加载。对于 130 MB 的 MNIST,情况确实如此。
但是,我仍然会批处理数据,因为它收敛得更快。查看SGD的优势了解更多详情。
我正在使用来自 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].shape
是torch.Size([1, 784])
但是,每个这样的 .pt 文件的大小约为 130MB。 具有随机生成的整数的相同大小的张量的大小为 6.6kB。 为什么这些张量这么大,我怎样才能减小它们的大小?
数据集是 42 000 个样本。我是否应该费心批量处理这些数据?我是否应该费心将张量保存到单独的文件中,而不是将它们全部加载到 RAM 中然后分批处理?这里的最佳方法是什么?
如 this discussion 中所述,torch.save()
保存整个张量,而不仅仅是切片。您需要使用 clone()
.
别担心,在运行时数据只会分配一次,除非您明确创建副本。
作为一般性建议:如果数据很容易放入您的记忆中,请立即加载。对于 130 MB 的 MNIST,情况确实如此。
但是,我仍然会批处理数据,因为它收敛得更快。查看SGD的优势了解更多详情。