我想了解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层,但是,在为这种形状分池时,索引似乎总是不正确。
答案 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())