【问题标题】:Get batch from collate_fn of Pytorch data loader从 Pytorch 数据加载器的 collat​​e_fn 获取批次
【发布时间】:2022-01-06 16:18:21
【问题描述】:

我正在阅读视频并将它们分成批处理。我的批次无法容纳整个视频。所以我使用整理功能将它们分开。视频的形状为 (128,3,224,224)。 其中 128 是帧,3 是通道 (RGB)。 使用整理功能后数据加载器的输出形状为 torch.Size([4, 32, 3, 224, 224]) 其中索引 0 是批处理。我如果通过这个浴数据,如果会得到内存错误。有没有办法发一批 2 .?
这是用于重现能力的代码。
生成虚拟数据

features=[]
labels=[]
#here the data is in ram, but actually its in disk and i cant load all data to ram to manipulate. 
for i in range(5):
    features.append(np.random.randint(low=0, high=256, size=(128,3,224,224)))
    labels.append(np.random.randint(low=0, high=2))

数据集

class DataReader(Dataset):
    def __init__(self,features,labels):
        self.features = features
        self.labels = labels

    def __getitem__(self, index):
        x=self.features[index]
        y=self.labels[index]
        return x,y
        
    def __len__(self):
        return len(self.features)

数据加载器

def reshaped(i,bs=32):
    i=i[len(i)%bs::].reshape(len(i)//bs,-1,3,224,224)
    return i
def collate_fn(batch):
    data=reshaped(batch[0])
    print(data.shape)
    label=[batch[1]]*len(data)
    return data,label
dl=DataLoader(DataReader(features,labels), batch_size =None, num_workers=0,pin_memory=True,shuffle=False,collate_fn=collate_fn)
batch=next(iter(dl))

batch[0] 形状是(4, 32, 3, 224, 224) 即使是单个批次,生成的数据也很大,所以我想发送(2, 32, 3, 224, 224) 然后另一个(2, 32, 3, 224, 224)

不要与batch=None 混淆,我只是禁用自动批处理。实际上batch=None 加载一批。我在整理功能中将该批次转换为四个批次。 但问题是现在所有四个都将被进一步发送,我希望只发送其中 2 个,然后再发送 2 个到模型,而不是同时发送所有四个。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    根据我的理解,每当您的模型转发时,都会调用 collat​​e_fn。所以,每次只取批处理中的当前元素和下一个元素。这可能不正确,您可以尝试一下吗?请告诉我结果。

    def collate_fn(batch):
        data = batch[0][0: 2] # current element and next element in the list
        label = batch[1][0: 2]
        return data,label
    

    【讨论】:

    • 这种方法的问题是它只会保留前 2 个并丢弃其余的
    • 如果在 DataLoader 中使用 batch_size=2 会发生什么,这不是你想要的吗?
    • 输出将(4*2, 32, 3, 224, 224)
    • 你能解释一下你的 def reshape 吗?
    猜你喜欢
    • 2020-01-17
    • 2021-03-24
    • 2020-05-02
    • 2021-01-03
    • 2020-01-08
    • 2019-06-02
    • 2020-10-09
    • 2021-08-25
    • 2019-12-14
    相关资源
    最近更新 更多