EfficientNetV1和MobileNet
前言
在之前的一些手工设计网络中(AlexNet,VGG,ResNet等等)经常有人问,为什么输入图像分辨率要固定为224,为什么卷积的个数要设置为这个值,为什么网络的深度设为这么深?这些问题你要问设计作者的话,估计回复就四个字——工程经验。而这篇论文主要是用NAS(Neural
Architecture
Search)技术来搜索网络的图像输入分辨率,网络的深度以及通道的宽度三个参数的合理化配置。在之前的一些论文中,基本都是通过改变上述3个参数中的一个来提升网络的性能,而这篇论文就是同时来探索这三个参数的影响。在论文中提到,本文提出的EfficientNet-B7在Imagenet
top-1上达到了当年最高准确率84.3%,与之前准确率最高的GPipe相比,参数数量(Params)仅为其1/8.4,推理速度提升了6.1倍(看上去又快又轻量,但个人实际使用起来发现很吃显存)。下图是EfficientNet与其他网络的对比(注意,参数数量少并不意味推理速度就快)。
## 论文思想
在之前的一些论文中,有的会通过增加网络的width即增加卷积核的个数(增加特征矩阵的channe ...
验证的时候记得启用Eval!
Model.eval 的作用是禁止批正则化层更新均值和方差。
当数据以个为单位进入,不存在均值,为避免均值和方差更新,因此需要开启。
实际中发现:
测试模型的时候是以Batch为单位测试,因此理论上可以不开启。
在训练的前期不开启有助于实现更高的指标。
准确率到达92以后,如果不关闭,准确率将不会再提升。
结论,请默认开启!
训练模型时加上图像数据增强吧
介绍
数据增强是防止过拟合最有效的方法,采取有效的数据增强策略可以将数据扩大十倍有余,有效提升模型泛化性,抑制过拟合。
全家福
123456789101112transform_train = transforms.Compose([ transforms.ColorJitter(brightness=0.8, contrast=0.8, saturation=0.8), transforms.RandomCrop(32, padding=4), #先四周填充0,在吧图像随机裁剪成32*32 transforms.RandomHorizontalFlip(), #图像一半的概率翻转,一半的概率不翻转 transforms.RandomRotation(degrees=10), transforms.ToTensor(), Cutout(n_holes=5, length=4), transforms.Normalize(mean=CIFAR_MEAN,std=CIFAR_STD), #R,G,B每层的归一化用到的均值和方差 ])
...
快来优化你的Pytorch的显存占用吧
介绍
本文介绍了使用混合精度训练和验证禁用梯度来优化显存的占用。根据笔者实测,混合精度训练对网络的影响几乎可以忽略不及,但是显存可以降低一半以上。
混合精度训练
1234567891011121314151617181920from torch.cuda.amp import autocastfrom torch.cuda.amp import GradScalerscaler = GradScaler()optimizer = optim.SGD(model.parameters(), lr=0.04, momentum=0.7, weight_decay=5e-4)for epoch in range(0, n_epochs): train_loss = 0.0 valid_loss = 0.0 model.train() for data, target in train_loader: optimizer.zero_grad() data = data.to(device) target = target ...
成功实现Pytorch并行运算!
介绍
在模型中进程会出现并行运算,比如在下列的\(InceptionV3\)的算子中:
三条支路的计算可以同步运算,如果实现,理论上可以达到3倍加速。
方案说明
torch.multiprocessing as mp
这是Pytorch实现的多进程库,采用的是Fork的方式实现多进程,具体而言就是在Start进程的位置继承前面的变量开启新的进程,很遗憾的是,一般情况下网络是不能共享的,两个进程各训练各的,最终都不返回训练的网络。需要使用另外一个库才能使其返回训练的梯度,和目前需求是不满足的。
Python官方的多进程库无法同时调用Cuda.
最终选用的方案是多线程,由于多个线程无需切换上下文,因此官方的Thread就可以实现并行运算,但是我们不能无限的把进程开下去,因此需要一个线程池进行管理,最终使用一个等待来等待线程的关闭,理论上协程也可以实现。
代码示例
联邦学习
1234567891011121314151617181920212223from concurrent.futures import ThreadPoolExecutorthread_p ...
神经网络结构搜索
GreedyNAS
动机与背景与思路
在目前的神经结构搜索领域中,One-Shot
NAS方法由于其搜索开销小被广泛应用,这些方法使用一个权重共享的超网络(Supernet)作为不同网络结构的性能评估器,因此,Supernet的训练对搜索结果的好坏至关重要。准确的评估对于Supernet来说是非常困难的,导致Supernet中结构的表现与其真实表现相关性很差
[1]。
在本篇论文中,我们提出一种贪心超网络来减轻Supernet的评估压力,使得Supernet更加贪心地注重于有潜力的好结构,而不是全体。具体而言,在Supernet训练过程中,我们提出了一种多路径拒绝式采样方法(Multi-path
sampling with rejection)来进行路径滤波 (path
filtering),使得有潜力的好结构得到训练。
通过这种方法,Supernet的训练从整个搜索空间贪心地缩小到了有潜力的结构组成的空间中,因此训练的效率得到了提升。同时,为了进一步增大有潜力结构的采样概率与提高训练效率,我们基于Exploration
and
Exploitation准则,使用一 ...
联邦学习
摘要: 本文介绍了联邦学习的概念与各种算法以及具体实现。
FedAvg算法
联邦学习原始论文中给出的FedAvg的算法框架为:
在这里插入图片描述
参数介绍:\(K\)表示客户端的个数,\(B\) 表示Batch_size,\(E\)表示本地更新的次数,\(\eta\)表示学习率。 \(P_k\)表示该客户端所有的数据。另外一个B表示的是由切分后的数据Batch组成的集合,\(C\)是比例,当\(C==1\)算法变为FedSGD。
从\(n\)个客户端选出随机选出\(m\)个客户端。
\(S_t\)为客户端的随机序列。
\(S_t\)中每个客户端并行进行梯度下降。
上传模型,中心服务器进行平均。
注意,我们发现
image-20221202081253192
全局模型的生成这一步对K个模型都进行了求和,但是实际上只抽样了m个客户端,我认为这种写法还是错误的。参考了书本和很多博客,这一步想要表达的意思就是说,随机选择m个客户端采样,对这m个客户端的梯度更新进行平均以形成全局更新,同时用当前全局模型替换未采样的客户端。\(n_k\) ...