在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实现远程调用MetaSploit的方法
Aug 22 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 Python
python3+PyQt5实现拖放功能
Apr 24 Python
python中subprocess批量执行linux命令
Apr 27 Python
Python为何不能用可变对象作为默认参数的值
Jul 01 Python
python将字符串转换成json的方法小结
Jul 09 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
详解pycharm2020.1.1专业版安装指南(推荐)
Aug 07 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
Python读写锁实现实现代码解析
Nov 28 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 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
用header 发送cookie的php代码
2007/03/16 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
js单向链表的具体实现实例
2013/06/21 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
js数组操作常用方法
2014/05/08 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
js的三种继承方式详解
2017/01/21 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
微信小程序 如何保持登录状态
2019/08/16 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
用JS实现一个简单的打砖块游戏
2019/12/11 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
Python队列的定义与使用方法示例
2017/06/24 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
Python3 max()函数基础用法
2019/02/19 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
Python collections模块使用方法详解
2019/08/28 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
序列化Python对象的方法
2020/08/01 Python
Internet主要有哪些网络群组成
2015/12/24 面试题
医院护士的求职信
2014/01/03 职场文书
电子邮箱格式怎么写
2014/01/12 职场文书
工人先进事迹材料
2014/12/26 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python