1.降维和升维
通过使用 1x1 卷积核,可以改变输入张量的通道数。当输入张量的通道数较大时,使用 1x1 卷积核进行卷积操作可以将通道数减小,从而降低模型的计算复杂度。相反,如果需要增加通道数,也可以使用 1x1 卷积核进行升维操作。
import torch
import torch.nn as nn
# 降维示例
c_in = 64 # 输入通道数
c_out = 32 # 输出通道数
conv = nn.Conv2d(c_in, c_out, kernel_size=1) # 使用1x1卷积核进行降维
x = torch.randn(1, c_in, 16, 16) # 输入张量
output = conv(x) # 降维后的输出张量
print(output.shape) # 输出: torch.Size([1, 32, 16, 16])
# 升维示例
c_in = 32 # 输入通道数
c_out = 64 # 输出通道数
conv = nn.Conv2d(c_in, c_out, kernel_size=1) # 使用1x1卷积核进行升维
x = torch.randn(1, c_in, 16, 16) # 输入张量
output = conv(x) # 升维后的输出张量
print(output.shape) # 输出: torch.Size([1, 64, 16, 16])
2.特征映射的线性变换
1x1 卷积核可以对特征映射进行线性变换,通过学习卷积核的权重和偏置,可以对输入特征进行适当的组合和变换。也就是在深度学习中,通过1x1卷积核进行特征映射的线性变换可以帮助模型学习更丰富的特征表示。通过调整1x1卷积核的权重和偏置,可以对输入特征进行组合和变换,以提取更具有表征性的特征。
3.实现跨通道的交互和信息整合
通过在不同通道之间应用 1x1 卷积核,可以实现特征融合和信息交互。1x1 卷积核可以对不同特征图的特征进行加权融合,从而促进特征之间的信息传递和交互。
import torch
import torch.nn as nn
# 定义输入特征图
x1 = torch.randn(1, 64, 16, 16) # 第一个输入特征图
x2 = torch.randn(1, 64, 16, 16) # 第二个输入特征图
# 使用1x1卷积核进行特征融合和信息交互
conv1 = nn.Conv2d(64, 32, kernel_size=1) # 第一个1x1卷积核 特征融合
conv2 = nn.Conv2d(64, 32, kernel_size=1) # 第二个1x1卷积核 消息交互
# 对特征图进行融合和信息交互
y1 = conv1(x1) # 第一个1x1卷积核的输出
y2 = conv2(x2) # 第二个1x1卷积核的输出
# 加权融合两个特征图
alpha = 0.5 # 加权系数
output = alpha * y1 + (1 - alpha) * y2
print(output.shape) # 输出: torch.Size([1, 32, 16, 16])
4.减少⽹络参数
以下为什么inception模块要先加1*1的卷积再加其他的卷积
可以拿以上这个特征图举例对比参数:
1.直接接55的卷积:5519232=153600
2.先用11,再接55:1119232+553232=31744
3.直接使用11:1119232=6144
先用11,再接55是为了更好提取特征的同时减少参数量。直接使用11在只要升维或者降维的时候,它可以提供一个最少的参数量。11卷积核我觉得最重要的作用就是在减少计算量的同时而不损失太多信息。