在Keras中CNN联合LSTM进行分类实例


Posted in Python onJune 29, 2020

我就废话不多说,大家还是直接看代码吧~

def get_model():
  n_classes = 6
  inp=Input(shape=(40, 80))
  reshape=Reshape((1,40,80))(inp)
 #  pre=ZeroPadding2D(padding=(1, 1))(reshape)
  # 1
  conv1=Convolution2D(32, 3, 3, border_mode='same',init='glorot_uniform')(reshape)
  #model.add(Activation('relu'))
  l1=LeakyReLU(alpha=0.33)(conv1)
 
  conv2=ZeroPadding2D(padding=(1, 1))(l1)
  conv2=Convolution2D(32, 3, 3, border_mode='same',init='glorot_uniform')(conv2)
  #model.add(Activation('relu'))
  l2=LeakyReLU(alpha=0.33)(conv2)
 
  m2=MaxPooling2D((3, 3), strides=(3, 3))(l2)
  d2=Dropout(0.25)(m2)
  # 2
  conv3=ZeroPadding2D(padding=(1, 1))(d2)
  conv3=Convolution2D(64, 3, 3, border_mode='same',init='glorot_uniform')(conv3)
  #model.add(Activation('relu'))
  l3=LeakyReLU(alpha=0.33)(conv3)
 
  conv4=ZeroPadding2D(padding=(1, 1))(l3)
  conv4=Convolution2D(64, 3, 3, border_mode='same',init='glorot_uniform')(conv4)
  #model.add(Activation('relu'))
  l4=LeakyReLU(alpha=0.33)(conv4)
 
  m4=MaxPooling2D((3, 3), strides=(3, 3))(l4)
  d4=Dropout(0.25)(m4)
  # 3
  conv5=ZeroPadding2D(padding=(1, 1))(d4)
  conv5=Convolution2D(128, 3, 3, border_mode='same',init='glorot_uniform')(conv5)
  #model.add(Activation('relu'))
  l5=LeakyReLU(alpha=0.33)(conv5)
 
  conv6=ZeroPadding2D(padding=(1, 1))(l5)
  conv6=Convolution2D(128, 3, 3, border_mode='same',init='glorot_uniform')(conv6)
  #model.add(Activation('relu'))
  l6=LeakyReLU(alpha=0.33)(conv6)
 
  m6=MaxPooling2D((3, 3), strides=(3, 3))(l6)
  d6=Dropout(0.25)(m6)
  # 4
  conv7=ZeroPadding2D(padding=(1, 1))(d6)
  conv7=Convolution2D(256, 3, 3, border_mode='same',init='glorot_uniform')(conv7)
  #model.add(Activation('relu'))
  l7=LeakyReLU(alpha=0.33)(conv7)
 
  conv8=ZeroPadding2D(padding=(1, 1))(l7)
  conv8=Convolution2D(256, 3, 3, border_mode='same',init='glorot_uniform')(conv8)
  #model.add(Activation('relu'))
  l8=LeakyReLU(alpha=0.33)(conv8)
  g=GlobalMaxPooling2D()(l8)
  print("g=",g)
  #g1=Flatten()(g)
  lstm1=LSTM(
    input_shape=(40,80),
    output_dim=256,
    activation='tanh',
    return_sequences=False)(inp)
  dl1=Dropout(0.3)(lstm1)
  
  den1=Dense(200,activation="relu")(dl1)
  #model.add(Activation('relu'))
  #l11=LeakyReLU(alpha=0.33)(d11)
  dl2=Dropout(0.3)(den1)
 
#   lstm2=LSTM(
#     256,activation='tanh',
#     return_sequences=False)(lstm1)
#   dl2=Dropout(0.5)(lstm2)
  print("dl2=",dl1)
  g2=concatenate([g,dl2],axis=1)
  d10=Dense(1024)(g2)
  #model.add(Activation('relu'))
  l10=LeakyReLU(alpha=0.33)(d10)
  l10=Dropout(0.5)(l10)
  l11=Dense(n_classes, activation='softmax')(l10)
 
  model=Model(input=inp,outputs=l11)
  model.summary()
  #编译model
  adam = keras.optimizers.Adam(lr = 0.0005, beta_1=0.95, beta_2=0.999,epsilon=1e-08)
  #adam = keras.optimizers.Adam(lr = 0.001, beta_1=0.95, beta_2=0.999,epsilon=1e-08)
  #sgd = keras.optimizers.SGD(lr = 0.001, decay = 1e-06, momentum = 0.9, nesterov = False)
 
  #reduce_lr = ReduceLROnPlateau(monitor = 'loss', factor = 0.1, patience = 2,verbose = 1, min_lr = 0.00000001, mode = 'min')
  model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
  
  return model

补充知识:keras中如何将不同的模型联合起来(以cnn/lstm为例)

可能会遇到多种模型需要揉在一起,如cnn和lstm,而我一般在keras框架下开局就是一句

model = Sequential()

然后model.add ,model.add , ......到最后

model.compile(loss=["mae"], optimizer='adam',metrics=[mape])

这突然要把模型加起来,这可怎么办?

以下示例代码是将cnn和lstm联合起来,先是由cnn模型卷积池化得到特征,再输入到lstm模型中得到最终输出

import os
import keras
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
from keras.models import Model
from keras.layers import *
from matplotlib import pyplot
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
from keras.layers import Dense,Dropout,Activation,Convolution2D,MaxPooling2D,Flatten
from keras.layers import LSTM
def design_model():
  # design network
  inp=Input(shape=(11,5))
  reshape=Reshape((11,5,1))(inp)
  conv1=Convolution2D(32,3,3,border_mode='same',init='glorot_uniform')(reshape)
  print(conv1)
  l1=Activation('relu')(conv1)
  conv2=Convolution2D(64,3,3, border_mode='same',)(l1)
  l2=Activation('relu')(conv2)
  print(l2)
  m2=MaxPooling2D(pool_size=(2, 2), border_mode='valid')(l2)
  print(m2)
  reshape1=Reshape((10,64))(m2)
  lstm1=LSTM(input_shape=(10,64),output_dim=30,activation='tanh',return_sequences=False)(reshape1)
  dl1=Dropout(0.3)(lstm1)
  # den1=Dense(100,activation="relu")(dl1)
  den2=Dense(1,activation="relu")(dl1)
  model=Model(input=inp,outputs=den2)
  model.summary() #打印出模型概况
  adam = keras.optimizers.Adam(lr = 0.001, beta_1=0.95, beta_2=0.999,epsilon=1e-08)
  model.compile(loss=["mae"], optimizer=adam,metrics=['mape'])
  return model
model=design_model()
history = model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, validation_data=[test_x, test_y],verbose=2, shuffle=True)
# #save LeNet_model_files after train
model.save('model_trained.h5')

以上示例代码中cnn和lstm是串联即cnn输出作为lstm的输入,一条路线到底

如果想实现并联,即分开再汇总到一起

可用concatenate函数把cnn的输出端和lstm的输出端合并起来,后面再接上其他层,完成整个模型图的构建。

g2=concatenate([g,dl2],axis=1)

总结一下:

这是keras框架下除了Sequential另一种函数式构建模型的方式,更有灵活性,主要是在模型最后通过 model=Model(input=inp,outputs=den2)来确定整个模型的输入和输出

以上这篇在Keras中CNN联合LSTM进行分类实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python文件和目录操作函数小结
Jul 11 Python
使用grappelli为django admin后台添加模板
Nov 18 Python
Django中实现点击图片链接强制直接下载的方法
May 14 Python
浅谈Python 的枚举 Enum
Jun 12 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
5款非常棒的Python工具
Jan 05 Python
解读python如何实现决策树算法
Oct 11 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
基于Python实现扑克牌面试题
Dec 11 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
pandas针对excel处理的实现
Jan 15 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
Jun 29 #Python
Python建造者模式案例运行原理解析
Jun 29 #Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 #Python
Python根据指定文件生成XML的方法
Jun 29 #Python
keras在构建LSTM模型时对变长序列的处理操作
Jun 29 #Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 #Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 #Python
You might like
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
深入PHP异步执行的详解
2013/06/03 PHP
php后门URL的防范
2013/11/12 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python机器学习之神经网络(二)
2017/12/20 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
python plotly画柱状图代码实例
2019/12/13 Python
使用CSS3的::selection改变选中文本颜色的方法
2015/09/29 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
视光学专业自荐信
2014/06/24 职场文书
2015入党自传格式范文
2015/06/26 职场文书
投诉信回复范文
2015/07/03 职场文书
小学班主任工作随笔
2015/08/15 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL