Fold#
- class torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)[source]#
Combines an array of sliding local blocks into a large containing tensor.
Consider a batched
inputtensor containing sliding local blocks, e.g., patches of images, of shape , where is batch dimension, is the number of values within a block (a block has spatial locations each containing a -channeled vector), and is the total number of blocks. (This is exactly the same specification as the output shape ofUnfold.) This operation combines these local blocks into the largeoutputtensor of shape by summing the overlapping values. Similar toUnfold, the arguments must satisfywhere is over all spatial dimensions.
output_sizedescribes the spatial shape of the large containing tensor of the sliding local blocks. It is useful to resolve the ambiguity when multiple input shapes map to same number of sliding blocks, e.g., withstride > 0.
The
padding,strideanddilationarguments specify how the sliding blocks are retrieved.stridecontrols the stride for the sliding blocks.paddingcontrols the amount of implicit zero-paddings on both sides forpaddingnumber of points for each dimension before reshaping.dilationcontrols the spacing between the kernel points; also known as the à trous algorithm. It is harder to describe, but this link has a nice visualization of whatdilationdoes.
- Parameters
output_size (int or tuple) – the shape of the spatial dimensions of the output (i.e.,
output.sizes()[2:])dilation (int or tuple, optional) – a parameter that controls the stride of elements within the neighborhood. Default: 1
padding (int or tuple, optional) – implicit zero padding to be added on both sides of input. Default: 0
stride (int or tuple) – the stride of the sliding blocks in the input spatial dimensions. Default: 1
If
output_size,kernel_size,dilation,paddingorstrideis an int or a tuple of length 1 then their values will be replicated across all spatial dimensions.For the case of two output spatial dimensions this operation is sometimes called
col2im.
Note
Foldcalculates each combined value in the resulting large tensor by summing all values from all containing blocks.Unfoldextracts the values in the local blocks by copying from the large tensor. So, if the blocks overlap, they are not inverses of each other.In general, folding and unfolding operations are related as follows. Consider
FoldandUnfoldinstances created with the same parameters:>>> fold_params = dict(kernel_size=..., dilation=..., padding=..., stride=...) >>> fold = nn.Fold(output_size=..., **fold_params) >>> unfold = nn.Unfold(**fold_params)
Then for any (supported)
inputtensor the following equality holds:fold(unfold(input)) == divisor * input
where
divisoris a tensor that depends only on the shape and dtype of theinput:>>> input_ones = torch.ones(input.shape, dtype=input.dtype) >>> divisor = fold(unfold(input_ones))
When the
divisortensor contains no zero elements, thenfoldandunfoldoperations are inverses of each other (up to constant divisor).Warning
Currently, only unbatched (3D) or batched (4D) image-like output tensors are supported.
- Shape:
Input: or
Output: or as described above
Examples:
>>> fold = nn.Fold(output_size=(4, 5), kernel_size=(2, 2)) >>> input = torch.randn(1, 3 * 2 * 2, 12) >>> output = fold(input) >>> output.size() torch.Size([1, 3, 4, 5])