赞
踩
VGG是由卷积层和池化层构成的一种基本CNN。将有权重的卷积层或全连接层叠加至16层,称为VGG16;同理,19层的称为VGG19。在2014年的比赛中获得了第二名的成绩,虽然性能上不及第一名GoogleNet,因其结构简单,应用性强,VGG广受研究人员喜爱。
VGG选择了3*3的kernels,stride为1,不存在信息丢失。训练时,用多分类交叉损失函数优化,使用mini-batch动量梯度下降法,引入dropout和L2权重正则化。经过74个epochs,实现快速收敛。
VGG16在Keras也已封装,权重从ImageNet训练而来,可以通过keras.applications导入。
将VGG16模型实例化。传入模型初始化的权重检查点weight,include_top指定是否包含FC,input_shape是输入网络中的图像张量的形状,可以自己设定或不选。
调用summary查看网格架构。下面这张图即为运行结果,引自《Python深度学习》电子书官网,非常清晰地描述了VGG的大体架构。
最后的特征图形状为(4,4,512),再后续添加个FC分类器。用到了两个Dense层。
同样地,我们可以绘制训练期间的loss和acc曲线,打印观察模型效果。可以得知,验证精度再90%以上,但模型几乎从一开始过拟合,这是因为没有设计数据增强(data augement)模块。数据增强方法计算速度慢,代价高,只有在计算机的GPU上尝试运行,但在解决过拟合问题上非常强大。这一点后续可以继续优化。
不带数据增强的特征提取↑
带数据增强的特征提取↑
除了数据增强,另有一种广泛使用的优化方法,模型微调(fine-tuning)。微调是指VGG特征提取前几个block冻结,顶部的几层解冻,将解冻部分和新增加部分(如FC)联合训练。好的策略是微调卷积基的最后两三层。
之所以解冻的是顶部层,可以这么理解:我们需要微调模型中抽象的表示,卷积基中更靠底部的层编码的是更加通用的可复用特征,而更靠顶部的层编码的是更专业化的特征。微调这些更专业化的特征更加有用,因为它们需要在你的新问题上改变用途。微调更靠底部的层,得到的回报会更少。
本文讨论并未验证微调模型的实验效果。查阅资料得知,模型微调后的测试精度达到了97%,这在Kaggle竞赛中也是相当不错的成绩。而且,可以用极小部分训练数据(约10%)就得到了这一训练成果,不得不说这是CNN相比Dense的一大优势。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。