从Pytorch数据加载器的collitter_fn获取批处理



我正在阅读视频,并将它们分成批。我无法将整个视频放入我的批次中。所以我用校勘函数把它们分开。视频的形状为(128,3224224(。其中128是帧,3是通道(RGB(。使用整理功能后,数据加载器的输出形状为手电筒大小([4,32,3224224](,其中索引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))

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

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

根据我的理解,每当您的模型转发时,都会调用collage_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

相关内容