使用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重新引入被覆盖的自带function
Jul 16 Python
Python导入txt数据到mysql的方法
Apr 08 Python
python3音乐播放器简单实现代码
Apr 20 Python
深入浅出分析Python装饰器用法
Jul 28 Python
python3 发送任意文件邮件的实例
Jan 23 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
python实现大文本文件分割
Jul 22 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
pyecharts动态轨迹图的实现示例
Apr 17 Python
基于python实现地址和经纬度转换
May 19 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 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
五个PHP程序员工具
2008/05/26 PHP
PHP 函数学习简单小结
2010/07/08 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
JS中数组重排序方法
2016/11/11 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
Python中decorator使用实例
2015/04/14 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
Python的UTC时间转换讲解
2019/02/26 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python底层封装实现方法详解
2020/01/22 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
设计总监岗位职责
2013/12/07 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
协议书模板
2014/04/23 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
Sql Server之数据类型详解
2022/02/28 SQL Server
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏