目录
Transformer里的multi-head self-attention
论文阅读与视频学习
ShuffleNet V1&V2
ShuffleNet V1
在ShuffleNet中提出了channel shuffle的思想,ShuffleNet Unit中全是GConv和DWConv。
GConv虽然能够减少参数与计算量,但GConv中不同组之间信息没有交流,为了解决此类问题,作者提出了Channel Shuffle的概念。
计算量主要来源于1×1卷积,将1×1卷积换为1×1的group卷积。
Input为c×h×w,bottleneck channel是m,各个网络block所需要的FLOPs:
ResNet:hw(2cm+9m^2)
ResNeXt:hw(2cm+9m^2/g)
ShuffleNet:hw(2cm/g+9m)
可以看出ShuffleNet所需FLOPs最小。
ShuffleNet V2
FLOPS:全大写,指每秒浮点运算次数,可以理解为计算的速度。是衡量硬件性能的一个指标。(硬件)
FLOPs:s小写,指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。(模型)在论文中常用GFLOPs(1 GFLOPs=10^9 FLOPs)
计算复杂度不能只看FLOPs,还有MAC(内存访问的时间成本),并行等级(在相同的FLOPs下,并行度高的模型要比并行度低的模型速度要快),平台(GUP,CPU等)。
提出的4条设计高效网络准则:
1.当卷积层的输入特征矩阵与输出特征矩阵channel相等时MAC最小(保持FLOPs不变时)。
2.当GConv的groups增大时(保持FLOPs不变时),MAC也会增大。
3.网络设计的碎片化程度越高,速度越慢。
4.Element-wise操作带来的影响是不可忽略的。(包括激活ReLu和相加的操作)
对于stage2的第一个block,它的两个分支中输出channel并不等于输入的channel,而是直接设置为指定输出的channel的一半。
EfficientNet V3
增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失,训练困难的问题。
增加网络的width(增大channel)能够获得更高细粒度的特征并且也更容易训练,但对于width很大而深度较浅的网络往往很难学习到更深层次的特征。
增加输入网络的图像分辨率能够潜在地获得更高细粒度的特征模板,但对于非常高的输入分辨率,准确率的增益也会减小。并且大分变率图像会增加计算量。
同时增加网络的depth、width和图像分辨率,在准确率达到80%时不会出现饱和,并且在相同FLOPS时,其准确率相较于其他几组最高。
EfficientNet-B0:
表中的卷积层后默认都跟有BN以及Swish激活函数。
MBConv:
第一个升维的1×1卷积层,它的卷积核个数是输入特征矩阵channel的n倍。DW卷积层channel不变,后一个1×1卷积层与表中对应channel相同。
当n=1时,不需要第一个升维的1×1卷积层,即Stage2中的MBConv结构都没有第一个升维的1×1卷积层(这与MobileNet V3网络类似)。
关于shortcut连接,仅当输入MBConv结构的特征矩阵与输出的特征矩阵shape相同时才存在。
这里的DW卷积的卷积核可能是3×3或5×5,具体参数根据表格。
注意在源码中,只有使用到shortcut连接的MBConv模块才有Dropout层。
SE模块由一个全局平均池化,两个全连接层组成。第一个全连接层的节点个数是输入该MBConv特征矩阵channels的1/4,且使用Swish激活函数。第二个全连接层的节点个数等于Depthwish Conv层输出的特征矩阵channels,且使用Sigmoid激活函数。
Width_coefficient代表channel维度上的倍率因子,比如在EfficientNet B0中Stage1的3×3卷积层所使用的卷积核个数是32,那么在B6中就是32×1.8=57.6接着取整数到离它最近的8的整数倍即56,其他Stage同理。
Depth-coefficient代表depth维度上的倍率因子(仅针对Stage2到Stage8),比如在EfficientNet B0中Stage7的L=4,那么在B6中就是4×2.6=10.4,接着向上取整即11。
Transformer里的multi-head self-attention
Transform可以做并行化
Self-Attention
Multi-head Self-Attention
位置编码
1.根据论文公式计算出位置编码
2.可训练的位置编码
代码练习
使用VGG模型进行猫狗大战
引用相关库:
下载数据:
训练集包含1800张图片(猫的图片900张,狗的图片900张),测试集包含2000张图片。
数据处理:
datasets 是 torchvision 中的一个包,可以用做加载图像数据。它可以以多线程(multi-thread)的形式从硬盘中读取数据,使用 mini-batch 的形式,在网络训练中向 GPU 输送。在使用CNN处理图像时,需要进行预处理。图片将被整理成 224×224×3的大小,同时还将进行归一化处理。
torchvision 支持对输入数据进行一些复杂的预处理/变换 (例如normalization, cropping, flipping, jittering 等)。具体可以参照 torchvision.tranforms 的官方文档说明。
创建VGG Model:
torchvision中集成了很多在 ImageNet (120万张训练数据) 上预训练好的通用的CNN模型,可以直接下载使用。
我们直接使用预训练好的 VGG 模型。同时,为了展示 VGG 模型对本数据的预测结果,还下载了 ImageNet 1000 个类的 JSON 文件。
在这部分代码中,对输入的5个图片利用VGG模型进行预测,同时,使用softmax对结果进行处理,随后展示了识别结果。可以看到,识别结果是比较非常准确的。
修改最后一层,冻结前面层的参数:
为了使用预训练好的模型,需要把最后的 nn.Linear 层由1000类,替换为2类。为了在训练中冻结前面层的参数,需要设置 required_grad=False。这样,反向传播训练梯度时,前面层的权重就不会自动更新了。训练中,只会更新最后一层的参数。
创建损失函数和优化器,然后训练模型:
测试模型:
可视化模型预测结果:
AI艺术鉴赏挑战
学习研习社上的代码方案:
下载数据集可以发现,训练集中的作品和对应作者的id都被存放在一个csv文件中。
阅读季军代码,可以发现作者首先将训练集和测试集中图片所对应的路径和其label分别存放于train.txt和val.txt两个txt文件中,并用‘,’分隔开,方便后续对图片和其label的读取、使用。
阅读ArtModel代码,可以发现定义了一个SELayer模块,引入了注意力机制。
通过观察model可以发现在网络结构中包含两个模型efficientnet-b3和resnext50,四个池化自适应平均值池化、自适应最大值池化、自适应组合池化(自适应最大值池化+自适应平均值池化)、广义均值池化。选择最优方案。
在训练时,涉及到一些分布式训练内容,理解和运行遇到了问题,还需要进一步学习。