如何在PyTorch中创建空张量?用于聚合DataLoader数据
PyTorch创建空张量并聚合DataLoader数据的实现方法
推荐方案:先收集列表再批量拼接
直接模仿Python列表的思路,先将每个batch的数据存入列表,最后一次性拼接成大张量——这种方式既避免了空张量维度不匹配的问题,又比多次torch.cat更高效(减少内存重复分配):
all_data_list = [] for data in dataloader: all_data_list.append(data) all_data_tensor = torch.cat(all_data_list, dim=0)
初始化匹配维度的空张量(不推荐,效率较低)
如果一定要初始化一个类似空列表的空张量,需要保证其维度、设备、数据类型与后续要拼接的data完全一致,否则会出现维度不匹配错误。示例如下:
# 先获取第一个batch的元信息,用于初始化空张量 first_batch = next(iter(dataloader)) # 空张量的第0维设为0,其余维度与batch一致,同时匹配设备和数据类型 all_data_tensor = torch.empty( (0,) + first_batch.shape[1:], device=first_batch.device, dtype=first_batch.dtype ) for data in dataloader: all_data_tensor = torch.cat((all_data_tensor, data), dim=0)
关于创建自定义DataLoader
如果你的最终目的是生成自定义DataLoader,拿到all_data_tensor后可以直接用TensorDataset封装:
from torch.utils.data import TensorDataset, DataLoader # 基于聚合后的张量创建数据集 dataset = TensorDataset(all_data_tensor) # 封装成自定义DataLoader custom_dataloader = DataLoader(dataset, batch_size=64, shuffle=True)
内容的提问来源于stack exchange,提问作者Peyman
相关产品推荐
相关产品推荐

