将基于3d张量的数据集切片为更小的张量长度



我有一个训练网络的数据集,由两个张量组成,我的特征和我的标签。我的演示集的形状是[351,4,34]代表特征,[351]代表标签。

现在,我想将数据集重新塑造成大小为k的块(理想情况下是在使用DataLoader加载数据时),以获得形状为[351 * n, 4, k]的特征和相应的标签形状[351 * n]的新演示集,n = floor(34/k)。主要目的是减少每个特征的长度,以减少之后我的网络的大小。

从 开始
t = [[1, 2, 3, 4], 
[5, 6, 7, 8]]

。a[2, 4]-张量,具有

l = [1, 0]

作为标签,我希望能够去(与k = 2)

t = [[1, 2], 
[3, 4], 
[5, 6], 
[7, 8]]
l = [1, 1, 0, 0]

or to (with k = 3)

t = [[1, 2, 3], 
[5, 6, 7]]
l = [1, 0]

我找到了重塑其中一个张量的一些解决方案(通过使用split()的变化),但随后我将不得不将其转移到我的其他张量上,因此我更喜欢在我的DataLoader中解决。

这可能吗?

您可以将输入重塑为所需的形状(第一个维度是n倍长),而标签可以与torch.repeat_interleave重复。

def split(x, y, k=2):
n = floor(x.size(1) / k)
x_ = x.reshape(len(x)*n, -1)[:,:k]
y_ = y.repeat_interleave(len(x_)//len(y))
return x_, y_

你可以这样测试:

>>> split(t, l, k=2)
(tensor([[1, 2],
[3, 4],
[5, 6],
[7, 8]]), tensor([1, 1, 0, 0]))
>>> split(t, l, k=3)
(tensor([[1, 2, 3],
[5, 6, 7]]), tensor([1, 0]))

我建议在你的数据集类中做这种处理。

最新更新