我正在尝试创建一个包含 10000 个样本的 3D 测试数据集(8000 个用于训练,2000 个用于验证)来测试我的 3D CNN 模型。看起来一切都很好,直到我尝试使用
Train_dataloader
查看我的 next(iter(Train_dataloader))
中的第一批数据。更具体地说,我似乎遇到了无限循环,即内核永远不会停止。
这是我的自定义数据集以及如何将它们放入
Train_dataloader
和 Test_dataloader
:
class Binary3DDataset(Dataset):
def __init__(self, data,transform=None):
self.data = data
self.transform = transform
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
sample = self.data[idx]
sample =self.transform(sample)
return sample
# Define data augmentation
data_transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomAffine(degrees = 15, translate = (0.1,0.1)),
transforms.ToTensor(),
])
# create 10000 random 3D sample with dimension [1, 32,32,32] "[#of channel, depth, height,width]"
num_samples = 10000
voxel_sample = np.random.choice([0, 1], size=(10000,1,32,32,32), p=[0.7, 0.3])
# Create an instance of custom dataset with data augmentation
augumented_custom_dataset = Binary3DDataset(voxel_sample,transform = data_transform)
# Create train and test dataloader to iterate over the augmented data
batch_size = 32
train_dataset, test_dataset = random_split(augumented_custom_dataset, [8000,2000])
Train_dataloader = DataLoader(train_dataset, batch_size = batch_size, shuffle = True,num_workers=1)
Test_dataloader = DataLoader(test_dataset,batch_size = batch_size, shuffle = False,num_workers=1)
当我尝试使用以下 python
Train_dataloader
和 iter
函数迭代和采样 next
中的第一个数据点时,似乎进入了无限循环类型的场景...
# Get one batch from the train_dataloader
data_iter = iter(Train_dataloader)
inputs = next(data_iter)
我尝试直接输出
Train_dataloader
和Test_dataloader
的长度。没有问题。仅当我尝试迭代数据加载器时,才会出现问题。
len(train_dataset),len(test_dataset),len(Train_dataloader),len(Test_dataloader)
输出:
(8000, 2000, 250, 63)
这意味着我们确实拥有两个数据加载器的长度信息。无法弄清楚为什么我在通过数据加载器迭代时遇到无限循环问题。
我也有同样的问题。通过从我的代码中删除
num_workers
解决了这个问题。