使用BERT
或ResNet
分别生成文本和图像特征时,由于文本自身长度和图像大小的限制,导致最后形成的特征数据在送入DataLoader
时会因为维度不同而报错:
RuntimeError: stack expects each tensor to be equal size
此时就需要自定义collate_fn
函数实现数据的自定义加载功能,下面首先看一下装入Dataset中的数据是什么:
可以看到:这里的batch是一个批量的数据,这和超参数batch_size
大小相关联。它是一个list类型的数据,其中每一个元素是一个包含了(数据1,数据2,...,数据n,label)
形式的元组,例如:
这里数据个数n
取决于你的Dataset中究竟是什么样的数据。以这个项目为例,这是一个多模态虚假新闻检测的例子中生成的数据,其中下标为0的数据是我们根据一张图片检测后形成的锚框以及整张图片的feature两者concat形成的特征值。具体可见下面代码段:
class UEMDataset(Dataset):def __init__(self,df,root_dir,image_id,text_id,image_vec_dir,text_vec_dir):# super(UNDataset, self).__init__()self.df = dfself.root_dir = root_dirself.image_id = image_idself.text_id = text_idself.image_vec_dir = image_vec_dirself.text_vec_dir = text_vec_dirself.adaptive_pooling = nn.AdaptiveAvgPool1d(768)def __len__(self):return len(self.df)def __getitem__(self, idx):if torch.is_tensor(idx):idx = idx.tolist()# filenames for the idxfile_name_image = self.df[self.image_id][idx].split(",")[0]file_name_text = self.df[