使用keras实现densenet和Xception的模型融合


Posted in Python onMay 23, 2020

我正在参加天池上的一个竞赛,刚开始用的是DenseNet121但是效果没有达到预期,因此开始尝试使用模型融合,将Desenet和Xception融合起来共同提取特征。

代码如下:

def Multimodel(cnn_weights_path=None,all_weights_path=None,class_num=5,cnn_no_vary=False):
	'''
	获取densent121,xinception并联的网络
	此处的cnn_weights_path是个列表是densenet和xception的卷积部分的权值
	'''
	input_layer=Input(shape=(224,224,3))
	dense=DenseNet121(include_top=False,weights=None,input_shape=(224,224,3))
	xception=Xception(include_top=False,weights=None,input_shape=(224,224,3))
	#res=ResNet50(include_top=False,weights=None,input_shape=(224,224,3))

	if cnn_no_vary:
		for i,layer in enumerate(dense.layers):
			dense.layers[i].trainable=False
		for i,layer in enumerate(xception.layers):
			xception.layers[i].trainable=False
		#for i,layer in enumerate(res.layers):
		#	res.layers[i].trainable=False
 
	if cnn_weights_path!=None:
		dense.load_weights(cnn_weights_path[0])
		xception.load_weights(cnn_weights_path[1])
		#res.load_weights(cnn_weights_path[2])
	dense=dense(input_layer)
	xception=xception(input_layer)

	#对dense_121和xception进行全局最大池化
	top1_model=GlobalMaxPooling2D(data_format='channels_last')(dense)
	top2_model=GlobalMaxPooling2D(data_format='channels_last')(xception)
	#top3_model=GlobalMaxPool2D(input_shape=res.output_shape)(res.outputs[0])
	
	print(top1_model.shape,top2_model.shape)
	#把top1_model和top2_model连接起来
	t=keras.layers.Concatenate(axis=1)([top1_model,top2_model])
	#第一个全连接层
	top_model=Dense(units=512,activation="relu")(t)
	top_model=Dropout(rate=0.5)(top_model)
	top_model=Dense(units=class_num,activation="softmax")(top_model)
	
	model=Model(inputs=input_layer,outputs=top_model)
 
	#加载全部的参数
	if all_weights_path:
		model.load_weights(all_weights_path)
	return model

如下进行调用:

if __name__=="__main__":
 weights_path=["./densenet121_weights_tf_dim_ordering_tf_kernels_notop.h5",
 "xception_weights_tf_dim_ordering_tf_kernels_notop.h5"]
 model=Multimodel(cnn_weights_path=weights_path,class_num=6)
 plot_model(model,to_file="G:/model.png")

最后生成的模型图如下:有点长,可以不看

使用keras实现densenet和Xception的模型融合

需要注意的一点是,如果dense=dense(input_layer)这里报错的话,说明你用的是tensorflow1.4以下的版本,解决的方法就是

1、升级tensorflow到1.4以上

2、改代码:

def Multimodel(cnn_weights_path=None,all_weights_path=None,class_num=5,cnn_no_vary=False):
	'''
	获取densent121,xinception并联的网络
	此处的cnn_weights_path是个列表是densenet和xception的卷积部分的权值
	'''
	dir=os.getcwd()
	input_layer=Input(shape=(224,224,3))
	
	dense=DenseNet121(include_top=False,weights=None,input_tensor=input_layer,
		input_shape=(224,224,3))
	xception=Xception(include_top=False,weights=None,input_tensor=input_layer,
		input_shape=(224,224,3))
	#res=ResNet50(include_top=False,weights=None,input_shape=(224,224,3))
 
	if cnn_no_vary:
		for i,layer in enumerate(dense.layers):
			dense.layers[i].trainable=False
		for i,layer in enumerate(xception.layers):
			xception.layers[i].trainable=False
		#for i,layer in enumerate(res.layers):
		#	res.layers[i].trainable=False
	if cnn_weights_path!=None:
		dense.load_weights(cnn_weights_path[0])
		xception.load_weights(cnn_weights_path[1])
 
	#print(dense.shape,xception.shape)
	#对dense_121和xception进行全局最大池化
	top1_model=GlobalMaxPooling2D(input_shape=(7,7,1024),data_format='channels_last')(dense.output)
	top2_model=GlobalMaxPooling2D(input_shape=(7,7,1024),data_format='channels_last')(xception.output)
	#top3_model=GlobalMaxPool2D(input_shape=res.output_shape)(res.outputs[0])
	
	print(top1_model.shape,top2_model.shape)
	#把top1_model和top2_model连接起来
	t=keras.layers.Concatenate(axis=1)([top1_model,top2_model])
	#第一个全连接层
	top_model=Dense(units=512,activation="relu")(t)
	top_model=Dropout(rate=0.5)(top_model)
	top_model=Dense(units=class_num,activation="softmax")(top_model)
	
	model=Model(inputs=input_layer,outputs=top_model)
 
	#加载全部的参数
	if all_weights_path:
		model.load_weights(all_weights_path)
	return model

这个bug我也是在服务器上跑的时候才出现的,找了半天,而实验室的cuda和cudnn又改不了,tensorflow无法升级,因此只能改代码了。

如下所示,是最后画出的模型图:(很长,底下没内容了)

使用keras实现densenet和Xception的模型融合

以上这篇使用keras实现densenet和Xception的模型融合就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 域名分析工具实现代码
Jul 15 Python
haskell实现多线程服务器实例代码
Nov 26 Python
python中的全局变量用法分析
Jun 09 Python
Python制作简易注册登录系统
Dec 15 Python
python实现各进制转换的总结大全
Jun 18 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
浅谈Python 命令行参数argparse写入图片路径操作
Jul 12 Python
python 装饰器的实际作用有哪些
Sep 07 Python
Django模型验证器介绍与源码分析
Sep 08 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
在keras下实现多个模型的融合方式
May 23 #Python
Keras使用ImageNet上预训练的模型方式
May 23 #Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 #Python
基于Python中random.sample()的替代方案
May 23 #Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 #Python
keras中模型训练class_weight,sample_weight区别说明
May 23 #Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 #Python
You might like
屏蔽浏览器缓存另类方法
2006/10/09 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
pycharm安装图文教程
2017/05/02 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
基于Modernizr 让网站进行优雅降级的分析
2013/04/21 HTML / CSS
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
简单的大学生自我鉴定
2014/02/18 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2014年节能工作总结
2014/12/18 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
郭明义电影观后感
2015/06/08 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
HTML常用标签超详细整理
2022/03/19 HTML / CSS