import torch import torch.nn.functional as F def max_shape(data): """Gets the maximum length along all dimensions in a list of Tensors""" shapes = torch.Tensor([_.shape for _ in data]) return torch.max( shapes.transpose(0, 1), dim=1, )[0].int() def pad_data_to_same_shape( tensor_list, pad_value=0, ): target_shape = max_shape(tensor_list) padded_dataset_shape = [len(tensor_list)] + list(target_shape) padded_dataset = torch.Tensor(*padded_dataset_shape).type_as( tensor_list[0]) for i, data in enumerate(tensor_list): # Get how much padding is needed per dimension padding = reversed(target_shape - torch.Tensor(list(data.shape)).int()) # Add 0 every other index to indicate only right padding padding = F.pad( padding.unsqueeze(0).t(), (1, 0, 0, 0), ).view(-1, 1) padding = padding.view(1, -1)[0].tolist() padded_data = F.pad( data, padding, value=pad_value, ) padded_dataset[i] = padded_data return padded_dataset