在Keras中CNN联合LSTM进行分类实例
作者:FQ_G 发布时间:2023-10-12 22:07:07
标签:Keras,CNN,LSTM,分类
我就废话不多说,大家还是直接看代码吧~
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)来确定整个模型的输入和输出
来源:https://blog.csdn.net/qq_33266320/article/details/80845619
0
投稿
猜你喜欢
- 数据丢失(缺失)在现实生活中总是一个问题。 机器学习和数据挖掘等领域由于数据缺失导致的数据质量差,在模型预测的准确性上面临着严重的问题。 在
- 前言最近在使用Pycharm,在运行或者安装的过程中出现了各种各样的报错,前面已经介绍过安装pygame出现报错的解决方法。文章总结了大部分
- 本文实例讲述了PHP面向对象程序设计继承用法。分享给大家供大家参考,具体如下:<?php//继承是子类(派生类)从父类(基类,超类)继
- 引言书接上回 Gradio机器学习模型快速部署工具【quickstart】翻译,讲到多输入输出,其实很简单,就是把多个组件包装到列表,inp
- 但Insus.NET想到的是,从下面的SQL语句,就可以查询到数据库大小。因此分享于此。 代码如下:SELECT DB_NAME
- 本文实例讲述了python常见数制转换用法。分享给大家供大家参考。具体分析如下:1.进位制度Python中二进制是以0b开头的:例如: 0b
- #coding:utf-8 #批量修改文件名 import os import re import datetime re_st = r
- 不知道大家有没有这样一个烦恼,“自己的电脑总是被别人使用,又不好意思设置密码”,所以利用python设计了一个程序来实现自由管控。功能虽然简
- Celery (芹菜)是基于Python开发的分布式任务队列。它支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。架
- 前言本来打算写的标题是XPath语法,但是想了一下Python中的解析库lxml,使用的是Xpath语法,同样也是效率比较高的解析方法,所以
- 临近春节,脚本之家小编带领大家用Python抢火车票!首先我们需要splinter安装:pip install splinter -i ht
- 基本的字符串位置查找方法Python 查找字符串使用 变量.find("要查找的内容"[,开始位置,结束位置]),开始位
- 本文实例讲述了python实现图片变亮或者变暗的方法。分享给大家供大家参考。具体实现方法如下:import Image# open an i
- 一、题目描述A:先输出提示语句,并接受用户输入的年、月。B:根据用户输入的年,先判断是否是闰年。C:根据用户输入的月来判断月的天数。D:用循
- 我就废话不多说了,还是直接看代码吧!import matha=1;//边1b=1;//边2c=math.sqrt(2);//边3A=math
- 脚本运行环境python 3.6+edge浏览器(推荐使用,因为在edge浏览器中可以获得额外12分,当然chrome浏览器也可以)webd
- 页面重构需要考虑的一个重点是XHTML代码语义化,就算是在无任何CSS样式修饰的情况下也能给他人在阅读时带来便利,甚至可以夸张点说在搜索引擎
- 讲了很多数据容器操作,这篇我们看看时间的处理。开发中常用的日期操作有哪些?获取当前时间获取系统秒数(从 * 时间开始)日期跟秒数之间转换获取日
- 一、起源 因子分析的起源是这样的:1904年英
- 大部分数据库管理员拥有某种形式的数据库元数据库,他们依赖其来跟踪范围很广的Microsoft SQL Server环境。我利用连接的服务器和