在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的Urllib库的一些高级用法
Apr 30 Python
Python中random模块用法实例分析
May 19 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
Python中偏函数用法示例
Jun 07 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
Oct 14 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
python实现udp传输图片功能
Mar 20 Python
Python3 中sorted() 函数的用法
Mar 24 Python
Python实现像awk一样分割字符串
Sep 15 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
Python实现的扫码工具居然这么好用!
Jun 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
留言板翻页的实现详解
2006/10/09 PHP
笑谈配置,使用Smarty技术
2007/01/04 PHP
PHP之变量、常量学习笔记
2008/03/27 PHP
PHP伪静态写法附代码
2008/06/20 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php单一接口的实现方法
2015/06/20 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
python从子线程中获得返回值的方法
2019/01/30 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
小学生秋游活动方案
2014/02/23 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
初中英语课后反思
2014/04/25 职场文书
个人务虚会发言材料
2014/10/20 职场文书
感谢信的格式
2015/01/21 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
JS高级程序设计之class继承重点详解
2022/07/07 Javascript