竞赛传送门: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:

from keras.applications.inception_resnet_v2 import InceptionResNetV2,preprocess_input

base_model = InceptionResNetV2(weights='imagenet',include_top=False)

x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(,activation='relu')(x)
predictions = Dense(,activation='sigmoid')(x)
model = Model(inputs=base_model.input, outputs=predictions) model.summary()

加入了imgaug库的数据增强:

from imgaug import augmenters as iaa

seq = iaa.Sequential([
iaa.CropAndPad(percent=(-0.1, 0.1)),
iaa.Sometimes(0.5,
iaa.GaussianBlur(sigma=(, 0.5))
),
iaa.ContrastNormalization((0.75, 1.5)),
iaa.AdditiveGaussianNoise(loc=, scale=(0.0, 0.05*)),
], random_order=True)
imglist=[]
imglist.append(X_train)
images_aug = seq.augment_images(X_train)

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

batch_size =
setup_to_transfer_learning(model, base_model)
history_t1 = model.fit_generator(train_generator,
steps_per_epoch=,
validation_data = val_generator,
epochs=,
callbacks=[reduce],
verbose=)
setup_to_fine_tune(model,base_model)
history_ft = model.fit_generator(train_generator,
steps_per_epoch=,
epochs=,
validation_data=val_generator,
validation_steps=,
callbacks=[reduce],
verbose=)

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

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

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

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

部分代码如下:

def arr2tag(arr1, arr2):
tags = []
for i in range(arr1.shape[]):
tag = []
index1 = np.where(arr1[i] > 0.3 )
index2 = np.where(arr2[i] > 0.3 )
index1 = index1[].tolist()
index2 = index2[].tolist()
index = list(set(index1).union(set(index2)))
tag = [hash_tag[j] for j in index]
tags.append(tag)
return tags
model = load_model('model1.h5')
y_pred1 = model.predict(X_test)
del model model = load_model('model2.h5')
y_pred2 = model.predict(X_test) 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. asp.net core2->2.1 webapi 进行了重大变更

    传统的在 启动时候 使用Mvc路由的配置不再有效.而是基于Attribute的声明标注进行配置路由.

  2. 【阿里巴巴Java开发手册——集合处理】13.集合的稳定性(order)和有序性(sort)

    有序性(sort):指遍历的结果是按照某种比较规则依次排列的. 稳定性(order):指集合每次遍历的元素的次序是一定的. 如:ArrayList是order/unsort HashMap是unord ...

  3. IntelliJ IDEA for Mac(Java 语言开发的集成环境)破解版安装

    1.软件简介    IntelliJ IDEA 是 macOS 系统上一款 java 语言开发的集成环境,IntelliJ 在业界被公认为最好的 java 开发工具之一,尤其在智能代码助手.代码自动提 ...

  4. Swift 类型桥接

    前言 iOS 中的 API 基本都是在许多年前由 OC 写成的,现在通过桥接的方法在 Swift 中可以用,基本看不出区别,非常自然.但是一些特殊的类型,在两种语言进行桥接的时候需要特别注意. 1.N ...

  5. C#-MVC开发微信应用(8)--菜单管理的实现

    之前讲解了微信后台管理页面的操作来管理菜单,下面我们在简单的来看一下,代码是如何实现的. 我们要实现获取微信的菜单.创建菜单.删除菜单等操作. 01.首先定义菜单操作的接口: /// <summ ...

  6. curl 调用jenkins的api

    jenkins提供了rest api,通过调用接口,可以执行一些job的操作,如构建job ,新建job,启用禁用等操作骑车 其次curl是什么? cURL是一个利用URL语法在命令行下工作的文件传输 ...

  7. request.GetResponse()超时的解决办法

    var request = (HttpWebRequest)WebRequest.Create(url); request.Timeout = Timeout.Infinite; request.Ke ...

  8. [ci]jenkins-slave-ssh docker容器化-用户名密码

    jenkins-slave-ssh docker容器化 架构 参考:https://www.youtube.com/watch?v=OxrBCt1JLuQ https://github.com/Dav ...

  9. JAVA 线程池架构浅析

    经历了Java内存模型.JUC基础之AQS.CAS.Lock.并发工具类.并发容器.阻塞队列.atomic类后,我们开始JUC的最后一部分:线程池.在这个部分你将了解到下面几个部分: 线程池的基础架构 ...

  10. python os详解

    1.os.getcwd()--起始执行目录 获取当前执行程序文件所在的目录,需要注意的是,getcwd不是获取代码所在文件的目录,也不是获取执行文件所在的目录,而是起始执行目录. 目录结构: test ...