MaxUnpool2d的索引超出范围

时间:2019-10-16 08:10:49

标签: conv-neural-network pytorch autoencoder max-pooling

我想了解Pytorch中的分拆,因为我想构建一个卷积自动编码器。

我有以下代码

from torch.autograd import Variable

data = Variable(torch.rand(1, 73, 480))
pool_t = nn.MaxPool2d(2, 2, return_indices=True)
unpool_t = nn.MaxUnpool2d(2, 2)
out, indices1 = pool_t(data)
out = unpool_t(out, indices1)

但是我在最后一行(正在分拆)不断出现此错误。

IndexError: tuple index out of range

尽管在此示例中模拟了数据,但由于必须进行预处理,因此输入必须具有该形状。

我对卷积网络还很陌生,但是我什至尝试在池化之前使用ReLU和卷积2D层​​,但是,在为这种形状分池时,索引似乎总是不正确。

1 个答案:

答案 0 :(得分:1)

您的数据是一维的,并且您正在使用2D池化和池化操作。

PyTorch将张量的前两个维解释为“批维”和“通道” /“特征空间”维。其余维度被视为空间维度。
因此,在您的示例中,data是大小为(1, 73, 480)的3D张量,并且被pytorch解释为单个批处理(“批处理尺寸” = 1),每个样本有73个通道,并且有480个样本。
出于某种原因,MaxPool2d会为您工作,并将通道尺寸视为空间尺寸,并对其进行采样-我不确定这是错误还是功能。

如果您确实想沿第二维采样,则可以添加一个附加维,使data成为4D张量:

out, indices1 = pool_t(data[None,...])
In [11]: out = unpool_t(out, indices1, data[None,...].size())