Hello all, I am following the caffe code to make a 3D bilinear kernel weight for upsampling (using ConvTranspose3d
). This is caffe code and my pytorch code:
CAFFE
int f = ceil(blob->shape(-1) / 2.);
float c = (2 * f - 1 - f % 2) / (2. * f);
for (int i = 0; i < blob->count(); ++i) {
float x = i % blob->shape(-1);
float y = (i / blob->shape(-1)) % blob->shape(-2);
float z = (i/(blob->shape(-1)*blob->shape(-2))) % blob->shape(-3);
data[i] = (1 - fabs(x / f - c)) * (1 - fabs(y / f - c)) * (1-fabs(z / f - c));
}
PYTORCH
def get_upsampling_weight(in_channels, out_channels, kernel_size):
"""Make a 3D bilinear kernel suitable for upsampling"""
factor = (kernel_size + 1) // 2
if kernel_size % 2 == 1:
center = factor - 1
else:
center = factor - 0.5
og = np.ogrid[:kernel_size, :kernel_size, :kernel_size]
filt = (1 - abs(og[0] - center) / factor) * \
(1 - abs(og[1] - center) / factor) * \
(1 - abs(og[2] - center) / factor)
weight = np.zeros((in_channels, out_channels, kernel_size, kernel_size, kernel_size),
dtype=np.float64)
weight[range(in_channels), range(out_channels), :, :, :] = filt
return torch.from_numpy(weight).float()
The problem is that it worked when I used in_channels=out_channels
, while has error when in_channels # out_channels
in pytorch 0.5 and python 3.6. This is an example to use
w=get_upsampling_weight(4, 16, 3)
The error is
in get_upsampling_weight
weight[range(in_channels), range(out_channels), :, :, :] = filt
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (4,) (16,)
How could I fix it? Thanks all