nn.Unfold函数详解

1.函数功能

        torch.nn.functional.unfold是PyTorch中用于将输入张量展开成局部块(patches)的类,它通常用于卷积操作,可以需要将卷积核滑动窗口展开并计算卷积时使用。这个操作会把图像或特征图的每个局部区域(滑动窗口)展平成一个列向量,并且将所有这些局部区域排列成一个大的矩阵。

2.函数定义

        torch.nn.Unfold(input, kernel_size, dilation=1, padding=0, stride=1)

        input:输入张量,形状为 (B, C, H, W) 。

        kernel_size:卷积核的大小,可以是整数或者是元组,如kernel_size=3 表示使用 3x3 的卷积核,kernel_size=(3, 5) 表示使用一个 3x5 的卷积核。

        dilation:扩张因子(默认为 1)。扩张卷积时,增加卷积核元素之间的间距。如dilation=1 表示常规卷积,dilation=2表示卷积核的元素之间间隔了一个像素,dilation=3表示间隔了两个像素,以此类推。

        padding:填充的大小(默认为 0)。这是在输入张量的边缘添加的零的数量,用来控制卷积输出的大小。

        stride:步幅(默认为 1)。卷积核在输入张量上滑动的步长。

3.函数返回值

        nn.Unfold 返回一个二维张量,形状为 [B, C * kernel_height * kernel_width, L],其中:

        其中,L 是展开的局部块数量,等于卷积操作后有效区域的数量,d代表的是维度,通常只有两个维度,分别是图像的高度H和宽度W,spatial_size[d]是是输入张量在维度 d上的大小。公式为:

        如何理解这个公式呢?假如我们在计算L在高度H维度上的长度L_H时,可以令K=dilation*(kernel_size-1)+1,那L_H可以写成:

L_H=\frac{spatialsize+2\times padding-K}{stride}+1

        这就和卷积公式的输出形式一样了,就很好理解了,L_W也是同理,所以L=L_H\times L_W.

        为什么K=dilation*(kernel_size-1)+1,举两个例子:

假设我们有一个 3x3 的卷积核,如果 dilation = 1,则使用原始卷积,操作如下:
Original 3x3 kernel:
[ 1, 1, 1 ]
[ 1, 1, 1 ]
[ 1, 1, 1 ]

如果 dilation = 2,则卷积核变成以下形式:
Dilated 3x3 kernel with dilation=2:
[ 1, 0, 1, 0, 1 ]
[ 0, 0, 0, 0, 0 ]
[ 1, 0, 1, 0, 1 ]
[ 0, 0, 0, 0, 0 ]
[ 1, 0, 1, 0, 1 ]
在这个扩张卷积中,卷积核的元素之间的间隔为1

如果 dilation = 3,依此类推。

4.应用举例

        假设我们有一个批次大小为1、输入通道为1、图像大小为4x4的图像,并且使用一个3x3的卷积核,步幅为1,没有填充。

import torch
import torch.nn as nn

# 创建一个大小为 (1, 1, 4, 4) 的随机输入张量
input = torch.randn(1, 1, 4, 4)

# 使用 nn.Unfold 层
unfold = nn.Unfold(kernel_size=3, stride=1, padding=0)
unfolded = unfold(input)

# 打印展开后的结果
print(unfolded.shape)


#返回值的形状:torch.Size([1, 9, 4])

        如果我们使用带填充和步幅的设置,unfold的返回值形状也会发生变化。假设我们使用步幅为2和填充为1:

import torch 
import torch.nn as nn

input = torch.randn(1, 1, 6, 6)

# 使用 nn.Unfold 层,填充为 1,步幅为 2
unfold = nn.Unfold(kernel_size=3, stride=2, padding=1)
unfolded = unfold(input)

print(unfolded.shape)

#返回值的形状:torch.Size([1, 9, 9])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值