卷积的模块在PyTorch中分为一维、二维和三维。在函数名上的体现是1d、2d、3d。
torch.nn.Conv1d
一维卷积层,输入的尺度是(N, C_in,L_in),输出尺度(N,C_out,L_out)。一维卷积一般用于文本数据,只对宽度进行卷积,对高度不卷积。
class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
torch.nn.Conv2d
二维卷积层, 输入的尺度是(N, C_in,H,W),输出尺度(N,C_out,H_out,W_out)
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
torch.nn.Conv3d
三维卷积层, 输入的尺度是(N, C_in,D,H,W),输出尺度(N,C_out,D_out,H_out,W_out)
class torch.nn.Conv3d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
参数说明:
- in_channels(
int
) – 输入信号的通道 - out_channels(
int
) – 卷积产生的通道 - kerner_size(
int
ortuple
) - 卷积核的尺寸 - stride(
int
ortuple
,optional
) - 卷积步长 - padding (
int
ortuple
,optional
)- 输入的每一条边补充0的层数 - dilation(
int
ortuple
, `optional``) – 卷积核元素之间的间距 - groups(
int
,optional
) – 从输入通道到输出通道的阻塞连接数 - bias(
bool
,optional
) - 如果bias=True
,添加偏置
这几个函数怎么选择就是要看输入的维数。
Conv1d用于三维张量(N,C,L)
layer = nn.Conv1d(3, 16, kernel_size=3) x = torch.rand(4, 3, 50) out = layer.forward(x) print(out.shape)
输出
torch.Size([4, 16, 48])
Conv2d用于四维张量(N,C,H,W)
layer = nn.Conv2d(1, 3, kernel_size=3, stride=1, padding=0) # 输入通道1;输出通道3;卷积核3x3;卷积核步长为1;不填充 x = torch.rand(1, 1, 28, 28) out = layer.forward(x) # 进行一次卷积的前向运算 print(out.shape)
输出
torch.Size([1, 3, 26, 26])
Conv3d用于五维张量(N,C,D,H,W)
layer = nn.Conv3d(3, 16, kernel_size=3, padding=1) x = torch.rand(4, 3, 28, 28, 28) out = layer.forward(x) print(out.shape)
输出
torch.Size([4, 16, 28, 28, 28])
输出图像的尺寸计算:
O:输出图像的尺寸
I:输入图像的尺寸
K:卷积核的尺寸
N:卷积核数量
S:移动步长
P:填充数
参数数量的计算:
2d卷积
输入层: Win*Hin*Cin (N个)
超参数:
过滤器个数(输出通道数):Cout
卷积核维度:w*h
参数量:(w*h*Cin+1)*Cout
3d卷积
输入层:Win*Hin*Din*Cin (N个)
超参数:
过滤器个数(输出通道数):Cout
卷积核维度:w*h*d
参数量:(w*h*d+1)*Cout