相关借鉴:
1、NIN:首个采用1x1卷积核的网络,舍弃全连接层,大大减少网络参数;
2、借鉴以往的多尺度Gabor滤波器提取特征;
3、赫布理论:一起激活的神经元连接在一起;
研究意义:
1、开启多尺度卷积核时代;
2、拉开1x1卷积广泛应用序幕;
3、为GoogleNet系列开辟道路;
1、主题:提出了名为Inception的深度卷积神经网络;
2、模型特点:Inception网络提高计算资源利用率,增加网络深度和宽度时,参数少量增加;借鉴Hebbain理论和多尺度处理;
Inception模块
特点:
1、多尺度卷积核;
2、1x1卷积降维,信息融合;
3、3x3 max pooling保留了特征图数量;
1x1卷积作用:压缩厚度,改变channel数量;
GoogLeNet结构:
1、三个阶段:卷积-池化快速降低分辨率;堆叠Inception;FC层分类输出;
2、增加两个辅助损失,缓解梯度消失(在中间特征图添加损失函数)
稀疏结构:
稀疏矩阵:数值为0的元素数量远远多于非0元素数量,且无规律;
稠密矩阵:数值非0的元素数量远远多于为0元素的数目,且无规律;
稀疏矩阵优点:可分解成密集矩阵计算来加快收敛速度;
辅助损失:
在Inception4b和Inception4e增加两个辅助分类层,用于计算辅助损失
作用:
1、增加Loss回传;
2、充当正则约束,迫使中间层特征也能具备分类能力;
学习率下降策略:
每8个epoch下降4%,800个epochs才下降0.016;
数据增强:
图像尺寸均分布在8%-100%之间,长宽比在[3/4,4/3]之间,最后做一些颜色变换;
Multi crop:
1、等比例缩放短边到256、288、320、352四种尺寸;(一分为四)
2、在长边上裁剪出3个正方形,左中右或者上中下,三个位置;(一分为三)
3、四个角、中心、全局resize,六个位置;(一分为六)
3、水平镜像;(一分为二)
Model Fusion:
七个融合模型训练差异仅在图像采样方式和顺序差异;
1、大量使用1x1卷积核,可降低维度,减少计算量,参数时AlexNet的1/12;
2、多尺度卷积核,实现多尺度特征提取;
3、辅助损失层,增加梯度回传,增加正则,减轻过拟合;
1、池化损失空间分辨率,但在定位、检测和人脸姿态识别中仍应用;定位、检测和人体姿态估计这些任务中十分注重空间分辨率信息;
2、增加模型深度和宽度可有效提升性能,但容易过拟合和计算量过大;
3、为了节省内存消耗,先将分辨率降低,再堆叠使用Inception Module;
4、最后一个全连接层,是为了更方便的微调,迁移学习;
5、网络中间层特征对于分类也具有判别性;
6、学习率下降策略为每8个epochs下降4%(Loss曲线很平滑);
7、数据增强方法:尺寸8%-100%、长宽比在[3/4,4/3]、光照畸变有效;
8、随机采用差值方法可提升性能;
9、实际应用中没有必要144 crops;
1、辅助损失层的定义:
class InceptionAux(nn.Module):
def __init__(self, in_channels, num_classes, conv_block=None):
super(InceptionAux, self).__init__()
if conv_block is None:
conv_block = BasicConv2d
self.conv = conv_block(in_channels, 128, kernel_size=1)
self.fc1 = nn.Linear(2048, 1024)
self.fc2 = nn.Linear(1024, num_classes)
def forward(self, x):
# aux1: N x 512 x 14 x 14, aux2: N x 528 x 14 x 14
x = F.adaptive_avg_pool2d(x, (4, 4))
# aux1: N x 512 x 4 x 4, aux2: N x 528 x 4 x 4
x = self.conv(x)
# N x 128 x 4 x 4
x = torch.flatten(x, 1)
# N x 2048
x = F.relu(self.fc1(x), inplace=True)
# N x 1024
x = F.dropout(x, 0.7, training=self.training)
# N x 1024
x = self.fc2(x)
# N x 1000 (num_classes)
return x
2、模型结构修改,全连接层输出个数
num_ftrs = googlenet_model.fc.in_features
googlenet_model.fc = nn.Linear(num_ftrs, num_classes)
num_ftrs_1 = googlenet_model.aux1.fc2.in_features
googlenet_model.aux1.fc2 = nn.Linear(num_ftrs_1, num_classes)
num_ftrs_2 = googlenet_model.aux2.fc2.in_features
googlenet_model.aux2.fc2 = nn.Linear(num_ftrs_2, num_classes)
3、损失函数的设定
optimizer.zero_grad()
loss_main, aug_loss1, aug_loss2 = criterion(outputs[0], labels), criterion(outputs[1], labels), \
criterion(outputs[2], labels)
loss = loss_main + (0.3 * aug_loss1) + (0.3 * aug_loss2)
loss.backward()