卷积神经网络CNN的设计
eras为例来说明。我们可以用5步 + 4种基本元素 + 9种基本层结构,这5-4-9模型来总结。这个博客特别适合小白入门简单粗暴地建立一个网络
知乎——CNN 网络应该如何设计?
回答1:网络多一层和少一层, 好像没什么区别. 但这样一层层测试调参未免太狗血了.一种挺好的方法是:
设计一种或几种block(这block由几层网络构成), 然后堆这种block.
这样看起来舒服多了,参考resnet网络结构(其实很多优秀网络都是这样的设计)至于每层的通道数, VGG有个设定是: 输出的feature
map大小相同时,卷积核个数也相同输出的feature map大小减半(被stride=2的卷积或Pooling后),
则卷积核数翻倍.这样让每层的时间花销相同.而通道数的大小如何确定? 基于对应数据集, 参考其他优秀模型的设置. 记得对比网络参数大小 .
回答2:建议在pre-trained model 基础之上进行改进。
回答3:我的经验是,要知道什么样的结构对具体任务有作用,最有效的办法就是去做对比实验,从而体会不同结构对网络性能的影响(参数量/计算量/训练稳定性/最终精度)。例如想找到kernel_size的最优值,只能通过控制变量,对比实验。
回答4:流程:
1-找baseline先找一个前人的基础网络结构,作为你设计的基础。可以是resnet,densenet,Alexnet这种非常经典的,且训练过程已经被大家复现过的。
2-调训练超参训练超参指的是: learning_rate, num_epoch, weight_decay, momentum还有learning_rate的下降方式以及其涉及到的所以超参等等。个人体会是,weight_decay 影响比较大,相对独立,也调起来也相对容易些,可以先调;learning_rate以及它的下降方法影响也比较大,但是这里相互关联的量很多,调起来比较费时费力;还有num_epoch,这个量也比较关键,调num_epoch的时候基本都得等到训练结束看结果,不太好像调其他参数那样,看情况不好就提前终止。
3-调结构在当前基础上找到一组合理的超参之后,就可以把这组超参固定,之后就可以进入到题主所想研究的调整结构了。这里可以调的东西很多,对于初学者来说,如果想了解网络中的每一层对结构的作用,其实可以逐层修改网络的结构。从而体会不同的layer_type和kernel_size等的影响。
4-再调训练超参因为其实不同的网络结构对应的最优训练超参不是一样的。这一套流程走下来,就算是对于训练参数量在在10M以下的模型,CIFAR10分类来说,也需要很多卡很多天啦。所以设计网络结构还真是一件非常费事费力的事情。
在inception和resnet网络提出并相对完善以后,网络结构的设计就不再爆发式出现了,这两大类网路涵盖了大部分应用的卷积网络结构。
对于大多数应用来说,应该使用迁移学习而不是从头训练网络。但是,你需要抉择保留哪些网络层,以及重新训练哪些层。这取决于你的数据是什么样的。你的数据与预训练的网络(通常在ImageNet上预训练)的数据越相似,你应该重新训练的层数越少,反之亦然。例如,你想分类图片中是否包含葡萄,所以你有一堆有葡萄的和一堆没有的图像。这些图像与ImageNet中的图像非常相似,因此你只需重新训练最后几层,也许就是全连接层。然而,如果你想对拍摄于外太空的图片,分类是否包含行星,那么这样的数据与ImageNet的数据有很大不同,所以你需要重新训练低层的卷积层。简而言之,遵循以下规则:
知乎——深度学习如何优化神经网络结构|架构?*景略集智的回答超详细keras建立训练测试CNN步骤!!
一、CNN设计及起源及一些资料
2:https://www.jiqizhixin.com/articles/2018-05-30-7(从Inception v1到Inception-ResNet,一文概览Inception家族的「奋斗史」)
3:https://blog.csdn.net/guoyunfei20/article/details/78122504(AlexNet)
4:http://210.28.132.67/weixs/book/CNN_book.html(一本讲CNN的书)
5:https://www.zhihu.com/question/19743656/answer/609887575(深度学习如何优化神经网络结构|架构?)
二、设计准则
1:https://www.cnblogs.com/arbalest/p/basic_CNN_design_method.html(简单CNN的基本网络元素及其设计原则)
2:https://www.jianshu.com/p/628d7099e019(关于CNN图像分类的一份综合设计指南)
3:https://www.jianshu.com/p/f7642437d55a(14种模型设计帮你改进你的卷积神经网络(CNN))
三、目前比较火的网络解析
1:https://blog.csdn.net/u013181595/article/details/80990930
2: https://www.jianshu.com/p/93990a641066
3: https://blog.csdn.net/maliang_1993/article/details/82084983(U-Net 网络结构理解)
4: https://zhuanlan.zhihu.com/p/53521053 (那些用字母开头的Net:U-Net 、V-Net、M-Net)
5: https://zhuanlan.zhihu.com/p/59217276(U-Net 和 ResNet:长短跳跃连接的重要性(生物医学图像分割))
2021.01.14如何设计卷积神经网络
1如何设计卷积神经网络?
参考资料1:想入门设计卷积神经网络?这是一份综合设计指南 内容总结:
1.准确率,速度,所占内存大小 三者的权衡——选择一个合适的CNN模型。
2.一些新颖的,加快减少内存消耗和运行时间的网络:Mobile Nets,XNOR net,shufflenet等
3.网络层数,激活函数,卷积核大小,空洞卷积,数据增强
4.优化器与学习率:SGD能够得到最好的准确率,但是没有Adam等优化器那么自适应地调节学习率的功能,调学习率很麻烦。策略:以 Adam 作为开始,它最容易使用:设置一个不太高的学习率,一般默认 0.0001,然后你通常会得到一些非常好的结果。随后你可以从零开始使用 SGD,或者使用 Adam,中间换到 SGD,能够以最容易的方式达到最好的准确率。
5.类别均衡
6.你的数据差别与ImageNet数据越大,需要改调的网络层数和参数就越多。ImageNet数据是类似于,有猫没猫,猫狗,有洋葱没洋葱之类的。
参考资料2:怎样设计最优的卷积神经网络内容总结:
1.提升CNN表现的操作:增加图片分辨率,增加网络宽度,增加网络深度,增加跳过连接(密集块或残差块)
2.NAS神经架构搜索+随机连接神经网络:探索新的网络架构和神经元连接方式(这个太远了不需要做)
1.泛化能力:是很重要的一个模型评价标准。提升泛化能力:使用正则化手段例如dropout。
2.summation ,下采样,maxout+ELUS,freeze-drop-path,循环学习率,bootstrapping
b 站视频——设计CNN
part one 网络深度的设计:网络深度增加作用:非线性表达能力提升。
1.评估深度对模型性能的影响:层数越多线性区间越多,更好地拟合。实验表明,错误率降低。
2.如何选择网络深度?根据一些工业界相关工作者的经验:从5——8层开始试验。imagenet 比赛中,2^5*7=224。一般不超过10层就能满足工业界的一些要求。
3.深度实验:一个复杂数据集vs一个简单数据集,20分类。一个性能简单的网络vs一个高性能网络。
网络1:ALLCONV网络 5-7层conv+1层全连接
网络2:MobileNet10-16层
图中看出增加卷积层(从5到7个卷积层)会提升准确率,但是7层再增加就出现了瓶颈。
MobileNet出现差不多的结果,从10层增加到16层时出现瓶颈。
4.网络深度增加带来的问题:过拟合,难以优化,PLD,PLS等。解决方案:跳层连接等。
part two 网络宽度的设计:网络宽度指的是每层卷积中滤波器filters(卷积核)的数量,例如VGG16网络第一层的filter数量就是64个,第一个卷积层的网络宽度就是64 ,第三个就是128,第五个就是256…为什么会增加卷积核的个数:“随着网络的加深,feathermap的长宽尺寸会变小,也就是卷积提取的特征越具有代表性,所以后面的卷积层数需要增加,所以卷积核的个数也是要增加的,一般是成倍增加(有的会更根据实验的情况来具体设置)。”
1.网络宽度下降,性能会下降。 更多的通道数可以学到更多的特征。所以要适当增加模型宽度。加宽比加深更能提升性能。但计算量提升也很快。
2.如何初始化CNN网络宽度?答:高效率模型第一层宽度为32足够。(根据经典网络结构和工作经验得出的结论)
3.优化:1*1卷积,分组卷积,跨层连接。
part three 提升模型泛化能力:正则化技术——DROPOUT and BN层的设计
1.类似技术:dropconnect,maxout,stochastic pooling
2.训练开dropout,预测时关闭?:不一定要关,大部分时候关掉可以提升准确率。
3.dropout 相当于增加了噪声,造成梯度的损失,训练时间更久才能收敛。要采用更大的学习率和momentum ,加快收敛。