Group Convolution(分组卷积)
分组卷积的优点:
-
减少参数数量:
在分组卷积中,每个分组只与一部分输入通道进行卷积运算,这意味着模型的参数数量会减少。例如,如果一个卷积层有8个输入通道和8个输出通道,且不使用分组,那么将有64个权重参数(8个输入通道 * 8个输出通道)。如果使用2组分组卷积,每个分组将只有4个输入通道和4个输出通道,因此每组只有16个权重参数,总共32个参数,减少了一半。 -
减少计算量:
由于参数数量的减少,分组卷积在前向传播和反向传播过程中的计算量也会减少。这可以加快训练和推理的速度,尤其是在资源受限的情况下。 -
提高并行度:
分组卷积可以提高计算的并行度,因为每个分组可以独立地进行计算。这使得分组卷积在多核处理器和GPU上更加高效。 -
节省内存:
减少参数和计算量也意味着节省了内存使用,这对于部署在内存受限的设备上的模型尤其重要。
简单来说运用分组卷积,可以减少参数数量由此可以提高训练速度。
实例:分组卷积计算需要将in_channel和out_channel除以groups
import torch
import torch.nn as nn
# 创建一个分组卷积层 conv1
# in_channels=8 表示输入通道数为8
# out_channels=6 表示输出通道数为6(卷积核个数)
# kernel_size=1 表示卷积核的大小为1x1
# groups=2 表示将输入通道分成2组进行分组卷积
conv1 = nn.Conv2d(in_channels=8, out_channels=6, kernel_size=1, groups=2)
# 创建一个非分组卷积层 conv2
# in_channels=8 表示输入通道数为8
# out_channels=6 表示输出通道数为6
# kernel_size=1 表示卷积核的大小为1x1
conv2 = nn.Conv2d(in_channels=8, out_channels=6, kernel_size=1)
# 创建一个假的输入数据,形状为(batch_size, channels, height, width)
# 这里假设batch_size=1, channels=8, height=1, width=1
input = torch.randn(1, 8, 1, 1)
# 执行分组卷积操作
output1 = conv1(input)
# 执行非分组卷积操作
output2 = conv2(input)
# 打印两个输出的形状
print(output1.shape)
print(output2.shape)
输出:
torch.Size([1, 16, 1, 1])
torch.Size([1, 16, 1, 1])# 对比内部计算和参数数量 # 对于conv1(分组卷积): # - 参数数量:由于分组卷积将输入通道分成2组,每组4个输入通道,每组有6个输出通道, # 因此每组的参数数量为 4(输入通道)* 6(输出通道)* 1^2(卷积核大小)= 24。 # 总参数数量为 24 * 2(组)= 48。 # - 计算量:每个输入通道只与同一组内的卷积核进行计算,因此计算量减少。 # 对于conv2(非分组卷积): # - 参数数量:非分组卷积的参数数量为 8(输入通道)* 6(输出通道)* 1^2(卷积核大小)= #48。 # - 计算量:每个输入通道与所有输出通道的卷积核进行计算,因此计算量较大。#虽然conv1和conv2的输出形状相同,但由于分组卷积减少了参数数量和计算量,它可以提高模型的训练速度和效率.