如何解决同时读取同一PyTorch torchvision.datasets对象
请考虑以下代码,以从torchvision.datasets
获取用于训练的数据集并为其创建一个DataLoader
。
import torch
from torchvision import datasets,transforms
training_set_mnist = datasets.MNIST('./mnist_data',train=True,download=True)
train_loader_mnist = torch.utils.data.DataLoader(training_set_mnist,batch_size=128,shuffle=True)
假设有几个Python进程可以访问文件夹./mnist_data
并同时执行上述代码;在我的情况下,每个进程都是群集上的不同机器,数据集存储在每个人都可以访问的NFS位置。您可能还假设数据已经下载到此文件夹中,因此download=True
应该无效。而且,每个过程都可以使用torch.manual_seed()
设置的不同种子。
我想知道PyTorch是否允许这种情况。我主要关心的是上面的代码是否可以更改./mnist_data
中的数据文件夹或文件,以便如果由多个进程运行,则可能导致意外行为或其他问题。同样,考虑到shuffle=True
,我希望如果2个或更多进程尝试创建DataLoader
,则假定种子是不同的,则每个进程都会得到不同的数据改组。这是真的吗?
解决方法
我主要关心的是上面的代码是否可以更改数据文件夹 或./mnist_data中的文件,以便如果由多个进程运行,则可以 可能导致意外行为或其他问题。
您会很好的,因为进程仅读取数据,而不进行修改(对于tensors
,将数据MNIST
加载到RAM中)。请注意,进程不不共享内存地址,因此带有数据的tensor
将被加载多次(对于MNIST
来说这不是一个大问题)。>
此外,考虑到
shuffle=True
,如果大于等于2, 进程尝试创建DataLoader,每个进程都会获得一个 假设种子不同,数据的改组也不同。
shuffle=True
与数据本身无关。它的作用是得到所提供的__len__()
中的dataset
,形成一个范围[0,__len__())
,并且此范围被改组并用于索引dataset
的{{1}}。请查看this section,以获取有关__getitem__
的更多信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。