项目作者: deepblacksky

项目描述 :
Kaggel Dog Breed Identification
高级语言: Python
项目地址: git://github.com/deepblacksky/Kaggle_Dog_Breed_Identification.git


Kaggle_Dog_Breed_Identification

Kaggel Dog Breed Identification
这是Kaggel的Kaggel Dog Breed Identification比赛

本代码使用了mxnet的gluon最新接口。关于gluon可查看其官方文档, https://zh.gluon.ai/http://gluon.mxnet.io/

Step

First Step

Second Step

将下载的数据解压后, 运行 preprocessing.py 进行数据预处理

Third Step

运行extract_features.py, 用resnet152_v1和inceptionv3预训练模型提取得到训练图片和测试集的特征向量, 并写入磁盘

  1. def get_features(net, data):
  2. features = []
  3. labels = []
  4. for X, y in tqdm(data):
  5. feature = net.features(X.as_in_context(ctx))
  6. features.append(feature.asnumpy())
  7. labels.append(y.asnumpy())
  8. features = np.concatenate(features, axis=0)
  9. labels = np.concatenate(labels, axis=0)
  10. return features, labels

Last Step

运行transfer_learning_train.py, 构建简单分类网络,将上一步提取的特征作为网络输入,然后进行训练, 最终在测试集上预测

  1. net = nn.Sequential()
  2. with net.name_scope():
  3. net.add(nn.BatchNorm())
  4. net.add(nn.Dense(1024))
  5. net.add(nn.BatchNorm())
  6. net.add(nn.Activation('relu'))
  7. net.add(nn.Dropout(0.5))
  8. net.add(nn.Dense(120))

Tips

  • 代码使用的是transfer_learning的学习方法, 先在预训练好的模型中提取特征, 多个网络的特征融合之后,再训练分类网络,
    这样既能提高准确率快速收敛,还能节省显存,可以在低配的机器中运行
  • 网络的选择,代码中选择了inceptionv3和resnet152_v1两个网络,是在大量尝试中得到的,具体请看这个链接https://github.com/ypwhs/DogBreed_gluon
  • 训练中的参数设置:
    • 图片输入的size
    • learning的decay策略
  • 使用更大的数据集进行数据扩充

最终在kaggle上得分为0.00595, 排名Top6%