我想构建一个物理模拟的替代模型。因此我可以自己生成数据。数据本身非常大,因此生成一些数据样本(例如一批 124 个)然后立即使用它进行训练是有意义的,而不是生成数百万个样本,因为我无法保存这样的数据集。通过这种方式,我可以生成一批,暂时保存/将其发送到正在等待数据的神经网络,然后在对其进行训练后丢弃它。
我通常使用 pytorch 实现我的模型,我也熟悉 torch.utils.data.DataLoader,它可以将批次提取到 RAM 中,但它需要目录结构和文件 ID,即整个数据集需要保存在某个地方。
首先,您关于DataLoader的说法并不完全正确。数据存储位置和提取位置的规则将由绑定到 DataLoader 的 Dataset 对象中的
__getitem__
或 __getitems__
控制。解决您的问题的最简单的解决方案是实现一个 CustomDataset,它将是 torch.utils.data.Dataset
类的子类。大概是这样的吧
class CustomDataset(torch.utils.data.Dataset):
def __init__(self, ndatapoints):
self.len = ndatapoints #the number of points you want to generate
'''
declare any other parameters related to your simulation here, just remember to add self. before the, to make them persistent in the class
'''
def __len__(self):
return self.len
def __getitem(self, id):
'''
simulate one datapoint here, maybe use id as a random seed, put the data in a torch.Tensor using something like dataTensor = torch.as_sensor(...)
'''
return dataTensor
您可能还想了解一下
torch.utils.data.IterableDataset
。然后声明它并将其放入 DataLoader
dataset = CustomDataset(10000)
dataLoader = torch.utils.data.DataLoader(dataset, batch_size=124)
您可以像您见过的任何其他数据加载器一样使用数据加载器,它基本上会一次生成
batch_size
数量的数据点,您可以将它们用作训练/验证的批次。如果您的模拟发生在 CPU 上,那么您可能需要在 DataLoader 构造函数中设置 num_workers
kwarg 以同时生成多个批次。