使用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实现360皮肤按钮控件示例
Feb 21 Python
python实现统计代码行数的方法
May 22 Python
socket + select 完成伪并发操作的实例
Aug 15 Python
Python logging模块用法示例
Aug 28 Python
Python 数据库操作 SQLAlchemy的示例代码
Feb 18 Python
利用Django模版生成树状结构实例代码
May 19 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
python中的TCP(传输控制协议)用法实例分析
Nov 15 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 Python
python实现超级马里奥
Mar 18 Python
Python调用C/C++的方法解析
Aug 05 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
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
JsRender for object语法简介
2014/10/31 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
学习jQuey中的return false
2015/12/18 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
2019/07/17 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
python flask中动态URL规则详解
2019/11/22 Python
Python读取csv文件实例解析
2019/12/30 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
预备党员思想汇报范文
2014/01/11 职场文书
运动会通讯稿100字
2014/01/31 职场文书
经典广告词大全
2014/03/14 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
旅游节目策划方案
2014/05/26 职场文书
班组拓展活动方案
2014/08/14 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
垂直极限观后感
2015/06/08 职场文书
思品教学工作总结
2015/08/10 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书