fn

max_unpool3d

Tensor
max_unpool3d(x: Tensor, indices: Tensor, kernel_size: int | tuple[int, int, int], stride: int | tuple[int, int, int] | None = None, padding: int | tuple[int, int, int] = 0, output_size: tuple[int, ...] | None = None)
source

Inverse of max_pool3d via scatter at saved argmax indices.

Volumetric version of max_unpool2d. Scatters the pooled values back to their saved (D, H, W) positions (encoded as flat D × H × W indices) on a zero canvas.

Parameters

xTensor
Pooled values, shape (N, C, D_in, H_in, W_in).
indicesTensor
Flattened argmax positions, same shape as x.
kernel_sizeint or (int, int, int)
Original pooling window size.
strideint or (int, int, int)= None
Original stride.
paddingint or (int, int, int)= 0
Original padding.
output_sizetuple of int= None
Required. Target spatial shape (..., D_out, H_out, W_out).

Returns

Tensor

Output of shape (N, C, D_out, H_out, W_out).

Notes

Implemented via scatter_add over a flattened spatial axis (so the gradient flows back to x and indices is treated as a non-differentiable lookup). See max_unpool1d for the math.

Examples

>>> import lucid
>>> from lucid.nn.functional import max_unpool3d
>>> x = lucid.randn(1, 1, 2, 2, 2)
>>> idx = lucid.zeros_like(x, dtype=lucid.int64)
>>> y = max_unpool3d(x, idx, kernel_size=2, output_size=(4, 4, 4))
>>> y.shape
(1, 1, 4, 4, 4)