基于CNN的海面舰船图像二分类
1.模型依赖的环境与硬件配置
- cuda:1.8.1+cu111
- GPU: NVIDIA GeForce MX150
2.VGG11的网络架构模型细节
-
input: 80 × 80 × 3 80\times80\times3 80×80×3
-
VGG11:
所有卷积层、FC1、FC2后都有batch normalization层和ReLU激活函数
且FC1、FC2后都有Dropout层,保留0.5的神经元
层 | 输出 |
---|---|
conv3-64 | 80 × 80 × 64 80\times80\times64 80×80×64 |
maxpool 2 × 2 + 2 ( s ) 2\times2+2(s) 2×2+2(s) | 40 × 40 × 64 40\times40\times64 40×40×64 |
conv3-128 | 40 × 40 × 128 40\times40\times128 40×40×128 |
maxpool 2 × 2 + 2 ( s ) 2\times2+2(s) 2×2+2(s) | 20 × 20 × 128 20\times20\times128 20×20×128 |
conv3-256 | 20 × 20 × 256 20\times20\times256 20×20×256 |
conv3-256 | 20 × 20 × 256 20\times20\times256 20×20×256 |
maxpool 2 × 2 + 2 ( s ) 2\times2+2(s) 2×2+2(s) | 10 × 10 × 256 10\times10\times256 10×10×256 |
conv3-512 | 10 × 10 × 512 10\times10\times512 10×10×512 |
conv3-512 | 10 × 10 × 512 10\times10\times512 10×10×512 |
maxpool 2 × 2 + 2 ( s ) 2\times2+2(s) 2×2+2(s) | 5 × 5 × 512 5\times5\times512 5×5×512 |
conv3-512 | 5 × 5 × 512 5\times5\times512 5×5×512 |
conv3-512 | 5 × 5 × 512 5\times5\times512 5×5×512 |
maxpool 2 × 2 + 2 ( s ) 2\times2+2(s) 2×2+2(s) | 2 × 2 × 512 2\times2\times512 2×2×512 |
FC1-2048 | 2048 × 1 2048\times1 2048×1 |
FC2-2048 | 2048 × 1 2048\times1 2048×1 |
FC3-2 | 2 × 1 2\times1 2×1 |
3.实验结果
本节给出基于VGG11的卷积神经网络分类模型对海面舰船数据的二分类结果。
3.1网络模型参数
3.1.1通用参数
总样本数 | 训练样本 | Batch size | Iteration | Epoch |
---|---|---|---|---|
4000(sea : ship=3:1) | 2400(60%) | 80 | 30 | 15 |
3.2.2 调整参数
模型序号 | N1 | N2 | N3 |
---|---|---|---|
学习率 | 1 e − 2 1e-2 1e−2 | { 1 e − 2 , e p o c h < = 5 1 e − 4 , 5 < e p o c h < = 10 1 e − 6 , 10 < e p o c h < = 15 \begin{cases} 1e-2,epoch<=5\\ 1e-4,5<epoch<=10\\ 1e-6,10<epoch<=15 \end{cases} ⎩⎪⎨⎪⎧1e−2,epoch<=51e−4,5<epoch<=101e−6,10<epoch<=15 | 同N1 |
优化器 | Adam | Adam | momentum(0.9) |
3.2 损失函数随epoch变化曲线
3.2.1 N1
如图所示,N1在epoch>3(iteration>90)时,loss开始在0.1振荡,且没有明显的下降趋势。在epoch>10时,loss降到e-2量级
且error_rate不稳定,波动大。
3.2.2 N2
所以,N2在epoch>5时,学习率调小为1e-4; epoch>10,学习率调小为1e-6
如图所示,在 e p o c h > 5 ( i t e r a t i o n > 150 , l r = 1 e − 4 ) epoch>5(iteration>150,lr=1e-4) epoch>5(iteration>150,lr=1e−4)时, l o s s loss loss有下降的趋势,从e-1量级到e-2量级。 e p o c h > 10 ( i t e r a t i o n > 300 , l r = 2 e − 7 ) epoch>10(iteration>300,lr=2e-7) epoch>10(iteration>300,lr=2e−7)时, l o s s loss loss能到达e-3量级,基本在e-2量级。
但error_rate随着learning rate减小趋于稳定值,1.8125%。
3.2.3 N3
如图所示,误差的量级能够下降并基本保持到e-3,比N2性能更好。且error_rate更稳定。
3.3分类模型对海面舰船的二分类结果
模型序号 | 训练精度(error %) |
---|---|
N1 | 2.8125 |
N2 | 1.8125 |
N3 | 0.8125 |
4.实验总结
-
可以使用下方代码,生成网络模块。简化代码。
self. =nn.Sequential()
-
使用GPU:(data、label也需要放到GPU上)
net.cuda( )#需要放在optimizer之前
-
误差计算公式
nn.CrossEntropyLoss()
公式:
l o s s ( x , c l a s s ) = − l o g ( x c l a s s ∑ j e x j ) loss(x,class)=-log(\frac{x_{class}}{\sum_j{e^{x_j}}}) loss(x,class)=−log(∑jexjxclass)
交叉熵损失函数,用于多分类, x x x是没有经过Softmax的激活值。
-
参数更新:
optim.Adam(net.parameters(),lr=2e-3) #lr :学习率
-
梯度计算:
loss.backward()
-
虽然 SGD–改良---->Momentum–升级–>RMSprop–升级–>Adam,但Adam性能不一定比Momentum好