竞赛传送门:https://www.tinymind.cn/competitions/42

我们就是傻狗天仙配啦~

决赛排行榜:

这次比赛感谢第一名的 baseline:https://blog.csdn.net/guleileo/article/details/81946511

我们的代码基于这个baseline,省去了自己编写数据读取、评分准则的麻烦。

首先,我们将baseline的模型换成ResNet50、DenseNet201空模型效果不好;然后,我们选择了迁移学习,参考博客:https://blog.csdn.net/tsyccnh/article/details/78889838,后来将其InceptionV3换成InceptionResNetV2:

  1. from keras.applications.inception_resnet_v2 import InceptionResNetV2,preprocess_input
  2.  
  3. base_model = InceptionResNetV2(weights='imagenet',include_top=False)
  4.  
  5. x = base_model.output
  6. x = GlobalAveragePooling2D()(x)
  7. x = Dense(,activation='relu')(x)
  8. predictions = Dense(,activation='sigmoid')(x)
  9. model = Model(inputs=base_model.input, outputs=predictions)
  10.  
  11. model.summary()

加入了imgaug库的数据增强:

  1. from imgaug import augmenters as iaa
  2.  
  3. seq = iaa.Sequential([
  4. iaa.CropAndPad(percent=(-0.1, 0.1)),
  5. iaa.Sometimes(0.5,
  6. iaa.GaussianBlur(sigma=(, 0.5))
  7. ),
  8. iaa.ContrastNormalization((0.75, 1.5)),
  9. iaa.AdditiveGaussianNoise(loc=, scale=(0.0, 0.05*)),
  10. ], random_order=True)
  11. imglist=[]
  12. imglist.append(X_train)
  13. images_aug = seq.augment_images(X_train)

之后基于这个模型开始了调节batchsize、steps及两个epoch的工作,我们调节的最佳结果:

  1. batch_size =
  2. setup_to_transfer_learning(model, base_model)
  3. history_t1 = model.fit_generator(train_generator,
  4. steps_per_epoch=,
  5. validation_data = val_generator,
  6. epochs=,
  7. callbacks=[reduce],
  8. verbose=)
  9. setup_to_fine_tune(model,base_model)
  10. history_ft = model.fit_generator(train_generator,
  11. steps_per_epoch=,
  12. epochs=,
  13. validation_data=val_generator,
  14. validation_steps=,
  15. callbacks=[reduce],
  16. verbose=)

这时,就得到了预赛排名榜的分数44.3。

下面是得到45.89分的两个关键的工作啦!

第一,将arr2tag函数中的0.5改成0.3。原因:数据集小,很多标签对应的训练图片数量少,预测得到的概率值低,所以需要调低阈值让更多正确标签预测到。

第二,模型融合。我们是将InceptionV3和InceptionResNetV2两个模型的结果融合,先将两个模型保存训练出来,然后求两个模型预测出的标签的并集。

部分代码如下:

  1. def arr2tag(arr1, arr2):
  2. tags = []
  3. for i in range(arr1.shape[]):
  4. tag = []
  5. index1 = np.where(arr1[i] > 0.3 )
  6. index2 = np.where(arr2[i] > 0.3 )
  7. index1 = index1[].tolist()
  8. index2 = index2[].tolist()
  9. index = list(set(index1).union(set(index2)))
  10. tag = [hash_tag[j] for j in index]
  11. tags.append(tag)
  12. return tags
  1. model = load_model('model1.h5')
  2. y_pred1 = model.predict(X_test)
  3. del model
  4.  
  5. model = load_model('model2.h5')
  6. y_pred2 = model.predict(X_test)
  7.  
  8. y_tags = arr2tag(y_pred1, y_pred2)

针对以上两个关键工作,可以提升的点:

两个0.3还可以调的精确些;模型融合还可以加入其它的模型一起融合。

小心情:没拿到第一还是有点遗憾的,报名后好长时间没有做,也没想到更好的方法,所以重心都放在调参上,学习率、epoch都试了很多,epoch甚至需要一个一个的减小。关键工作都在是比赛结束前一天晚上和最后的上午完成的。我们队由傻狗和天仙两人组成,天仙之前在一个公众号里看到模型融合的方法,最后一天晚上决定再试一试这种方法,傻狗很聪明,训练需要保存的模型时将arr2tag函数里的0.5改成0.4,早晨提交发现结果提升了1分多,欢喜得不得了。这次比赛还是收获颇丰哒~

傻狗刚刚说给大家公开一下代码吧,那好吧:https://github.com/feifanrensheng/TinyMind-

TinyMind 多标签图像分类竞赛 之路的更多相关文章

  1. 《PYTHON机器学习及实践-从零开始通往KAGGLE竞赛之路》 分享下载

    转: <PYTHON机器学习及实践-从零开始通往KAGGLE竞赛之路> 分享下载 书籍信息 书名: PYTHON机器学习及实践-从零开始通往KAGGLE竞赛之路 标签: PYTHON机器学 ...

  2. multi-label image classification:多标签图像分类总结

    多标签图像分类总结 目录 1.简介 2.现有数据集和评价指标 3.学习算法 4.总结(现在存在的问题,研究发展的方向) 简介 传统监督学习主要是单标签学习,而现实生活中目标样本往往比较复杂,具有多个语 ...

  3. 《机器学习及实践--从零开始通往Kaggle竞赛之路》

    <机器学习及实践--从零开始通往Kaggle竞赛之路> 在开始说之前一个很重要的Tip:电脑至少要求是64位的,这是我的痛. 断断续续花了个把月的时间把这本书过了一遍.这是一本非常适合基于 ...

  4. 《Python机器学习及实践:从零开始通往Kaggle竞赛之路》

    <Python 机器学习及实践–从零开始通往kaggle竞赛之路>很基础 主要介绍了Scikit-learn,顺带介绍了pandas.numpy.matplotlib.scipy. 本书代 ...

  5. 多标签图像分类任务的评价方法-mAP

    http://blog.sina.com.cn/s/blog_9db078090102whzw.html 多标签图像分类(Multi-label Image Classification)任务中图片的 ...

  6. CVPR 2019细粒度图像分类竞赛中国团队DeepBlueAI获冠军 | 技术干货分享

    [导读]CVPR 2019细粒度图像分类workshop的挑战赛公布了最终结果:中国团队DeepBlueAI获得冠军.本文带来冠军团队解决方案的技术分享. 近日,在Kaggle上举办的CVPR 201 ...

  7. Python机器学习及实践+从零开始通往Kaggle竞赛之路

    内容简介 本书面向所有对机器学习与数据挖掘的实践及竞赛感兴趣的读者,从零开始,以Python编程语言为基础,在不涉及大量数学模型与复杂编程知识的前提下,逐步带领读者熟悉并且掌握当下最流行的机器学习.数 ...

  8. Python机器学习及实践_从零开始通往KAGGLE竞赛之路PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:i5nw Python机器学习及实践面向所有对机器学习与数据挖掘的实践及竞赛感兴趣的读者,从零开始,以Python编程语言为基础,在不涉及大量数学模型与复杂编程知识的前提下,逐步带领读 ...

  9. 湖南师范大学第五届大学生计算机程序设计竞赛--G--修路

    题目链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11464&courseid=132 题目: ...

随机推荐

  1. android的activity被杀死后如何重启

    最近公司的大屏展示机器人上的程序运行时间长了,比如五天,十天会出现偶尔的崩溃,查日志可能是内存溢出或者是ndk层的错误,这种错误一时也不太好查找,但是产品那边有个要求就是程序退出了一定要能重启,能抓日 ...

  2. OpenLayers 官网例子的中文详解

    https://segmentfault.com/a/1190000009679800?utm_source=tag-newest 当你希望实现某种功能的时候,即使你对 openlayers 几乎一窍 ...

  3. HTML Entity 字符实体(字符转义)

    目录 1. HTML Entity 2. 字符与Entity Name的互相转换 3. 字符与Entity Number的互相转换 1. HTML Entity 1.1 介绍 在编写HTML页面时,需 ...

  4. THE OVERARCHING PROCESS OF TEST DESIGN

    THE OVERARCHING PROCESS OF TEST DESIGN -Test note of “Essential Software Test Design” 2015-08-27 Con ...

  5. MySQL的binlog日志<转>

    binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...

  6. JVM 内部原理(四)— 基本概念之 JVM 结构

    JVM 内部原理(四)- 基本概念之 JVM 结构 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime En ...

  7. 初试 Kubernetes 集群中使用 Traefik 反向代理

    初试 Kubernetes 集群中使用 Traefik 反向代理 2017年11月17日 09:47:20 哎_小羊_168 阅读数:12308    版权声明:本文为博主原创文章,未经博主允许不得转 ...

  8. Java知多少(61)线程优先级

    线程优先级被线程调度用来判定何时每个线程允许运行.理论上,优先级高的线程比优先级低的线程获得更多的CPU时间.实际上,线程获得的CPU时间通常由包括优先级在内的多个因素决定(例如,一个实行多任务处理的 ...

  9. MQTT 学习记录

    学习mqtt协议,从网上找demo验证一下. 参考链接 https://www.jianshu.com/p/ebbe25d1c4b2 https://blog.csdn.net/xxmonstor/a ...

  10. 使用grep查找字符串

    如下: grep -r 'target string' --exclude='pattern' dir/ 例子: grep -r Debug --exclude='*.js' ./ 查找本目录下除了j ...