在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 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Sep 06 Python
pygame学习笔记(4):声音控制
Apr 15 Python
Python使用turtule画五角星的方法
Jul 09 Python
利用Python获取赶集网招聘信息前篇
Apr 18 Python
Python中list初始化方法示例
Sep 18 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
使用Eclipse如何开发python脚本
Apr 11 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
详解用Python练习画个美队盾牌
Mar 23 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 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加密解密的代码
2006/10/09 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
PHP面向对象之旅:深入理解static变量与方法
2014/01/06 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
PHP笛卡尔积实现原理及代码实例
2020/12/09 PHP
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
javascript基本算法汇总
2016/03/09 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
解密Python中的描述符(descriptor)
2015/06/03 Python
python Django批量导入数据
2016/03/25 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
用python进行视频剪辑
2020/11/02 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
高中生自我评价个人范文
2013/11/09 职场文书
毕业生自荐信格式
2014/03/07 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
工人先进事迹材料
2014/12/26 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
Django与数据库交互的实现
2021/06/03 Python
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android