1.首先我们了解一下keras中的Embedding层:from keras.layers.embeddings import Embedding:

Embedding参数如下:

输入尺寸:(batch_size,input_length)

输出尺寸:(batch_size,input_length,output_dim)

举个例子:(随机初始化Embedding):

from keras.models import Sequential
from keras.layers import Embedding
import numpy as np model = Sequential()
model.add(Embedding(, , input_length=))
# 输入大小为(None,10),Nnoe是batch_size大小,10代表每一个batch中有10条样本
# 输出大小为(None, , ),其中64代表输入中每个每条样本被embedding成了64维的向量 input_array = np.random.randint(, size=(, )) model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)
print(output_array)
assert output_array.shape == (, , )

具体可以看下面的例子:

from keras.models import Sequential
from keras.layers import Flatten, Dense, Embedding
import numpy as np model = Sequential()
model.add(Embedding(, , input_length=))
#通俗的讲,这个过程中,Embedding层生成了一个大小为3*2的随机矩阵(3代表词汇表大小,,2代表没个词embedding后的向量大小),记为M,查看矩阵M:
model.layers[].get_weights()
#输出
[array([[-0.00732628, -0.02913231],
[ 0.00573028, 0.0329752 ],
[-0.0401206 , -0.01729034]], dtype=float32)]

矩阵的每一行是该行下标指示的标记的数值向量,即矩阵M的第i(0,1,2)行是index为i的单词对应的数值向量,比如说,我的输入如果index=1,则对应的embedding向量= [ 0.00573028, 0.0329752 ],具体看下面:

data = np.array([[,,,,,,],[,,,,,,]]
model.predict(data))
#输出
[[[-0.00732628 -0.02913231]
[ 0.00573028 0.0329752 ]
[-0.0401206 -0.01729034]
[ 0.00573028 0.0329752 ]
[ 0.00573028 0.0329752 ]
[-0.00732628 -0.02913231]
[ 0.00573028 0.0329752 ]] [[-0.00732628 -0.02913231]
[ 0.00573028 0.0329752 ]
[-0.0401206 -0.01729034]
[ 0.00573028 0.0329752 ]
[ 0.00573028 0.0329752 ]
[-0.00732628 -0.02913231]
[ 0.00573028 0.0329752 ]]]

data是Embedding层的输入,它包含2个batch,每个batch有7条样本,即data.shape = (2,7), 输出out的shape = (2,7,2),即每一条样本被embedding成了2维向量。

有时候我们可以用预训练好的embedding matrix初始化(使用百度百科(word2vec)的语料库):

def create_embedding(word_index, num_words, word2vec_model):
embedding_matrix = np.zeros((num_words, EMBEDDING_DIM))
for word, i in word_index.items():
try:
embedding_vector = word2vec_model[word]
embedding_matrix[i] = embedding_vector
except:
continue
return embedding_matrix
#word_index:词典
#num_word:词典长度+1
#word2vec_model:词向量的model embedding_matrix = create_embedding(word_index, num_words, word2vec_model) model = Sequential()
embedding_layer = Embedding(num_words,
EMBEDDING_DIM, #embedding后的向量大小
embeddings_initializer=Constant(embedding_matrix), #使用预训练好的embedding matrix初始化
input_length=MAX_SEQUENCE_LENGTH, #输入的每个batch中样本个数
trainable=False)
input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_input = embedding_layer(sequence_input)
model.add(embedded_sequences)

其实Keras实现LLSTM(其它网络模型也一样),就像是在堆积木:

#单层LSTM
model = Sequential()
model.add(Embedding(len(words)+, , input_length=maxlen))
model.add(LSTM(output_dim=, activation='sigmoid', inner_activation='hard_sigmoid'))
model.add(Dropout(0.5))
model.add(Dense())
model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
#model.compile(loss='binary_crossentropy', optimizer='adam', class_mode="binary") model.fit(x, y, batch_size=, nb_epoch=)
y_= model.predict_classes(x) #多层LSTM

model = Sequential()

#多层LSTM中,最后一个LSTM层return_sequences通常为false,非最后一层为True

#return_sequences:默认为false。当为False时,返回最后一层最后一个步长的隐藏状态;当为True时,返回最后一层的所有隐藏状态

model.add(LSTM(layers[1], input_shape=(seq_len, layers[0]),return_sequences=True))
#model.add(Dropout(0.2))

model.add(LSTM(layers[2],return_sequences=False))
#model.add(Dropout(0.2))

model.add(Dense(units=layers[3], activation='tanh'))

下面附上LSTM在keras中参数return_sequences,return_state的超详细区别:

一,定义

return_sequences:默认为false。当为假时,返回最后一层最后一个步长的隐藏状态;当为真时,返回最后一层的所有隐藏状态。

return_state:默认false。当为真时,返回最后一层的最后一个步长的输出隐藏状态和输入单元状态。

二,实例验证

下图的输入是一个步长为3,维度为1的数组。

一共有2层神经网络(其中第一层必须加上“return_sequences =真”,这样才能转化成步长为3的输入变量)

(1)return_sequences =True

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
from keras.models import Sequential data = array([0.1,0.2,0.3]).reshape((1,3,1))
inputs1 = Input(shape=(3,1))
lstm1,state_h,state_c = LSTM(2,return_sequences=True,return_state=True)(inputs1) #第一层LSTM
lstm2 = LSTM(2,return_sequences=True)(lstm1) #第二层LSTM
model = Model(input = inputs1,outputs = [lstm2]) print(model.predict(data))

输出结果为:(最后一层LSTM2的每一个时间步长hidden_​​state的结果)

[[[0.00120299 0.0009285] 
  [0.0040868 0.00327] 
  [0.00869473 0.00720878]]]

(2)return_sequence = False,return_state = True

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
from keras.models import Sequential data = array([0.1,0.2,0.3]).reshape((1,3,1))
inputs1 = Input(shape=(3,1))
lstm1,state_h,state_c = LSTM(2,return_sequences=True,return_state=True)(inputs1)
lstm2,state_h2,state_c2 = LSTM(2,return_state=True)(lstm1)
model = Model(input = inputs1,outputs = [lstm2,state_h2,state_c2]) print(model.predict(data))

输出为:

因为return_state =真,返回了最后一层最后一个时间步长的输出hidden_​​state和输入cell_state。

[array([[ - 0.00234587,0.00718377]],dtype = float32),array([[ - 0.00234587,0.00718377]],dtype = float32),array([[ - 0.00476015,0.01406127]],dtype = float32)]

(3)return_sequence = True,return_state = True

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
from keras.models import Sequential data = array([0.1,0.2,0.3]).reshape((1,3,1))
inputs1 = Input(shape=(3,1))
lstm1,state_h,state_c = LSTM(2,return_sequences=True,return_state=True)(inputs1)
lstm2,state_h2,state_c2 = LSTM(2,return_sequences=True,return_state=True)(lstm1)
model = Model(input = inputs1,outputs = [lstm2,state_h2,state_c2]) print(model.predict(data))

输出为:最后一层所有时间步长的隐藏状态,及最后一层最后一步的隐藏状态,细胞状态。

[array([[[ - [2.0248523e-04,-1.0290105e-03],
        [ - 3.6455912e-04,-3.3424206e-03],
        [ - 3.66696041e-05,-6.6624139e-03]]],dtype = FLOAT32),

array([[ - 3.669604e-05,-6.662414e-03]],dtype = float32),

array([[ - 7.3107367e-05,-1.3788906e-02]],dtype = float32)]

(4)return_sequence = False,return_state = False

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from numpy import array
from keras.models import Sequential data = array([0.1,0.2,0.3]).reshape((1,3,1))
inputs1 = Input(shape=(3,1))
lstm1,state_h,state_c = LSTM(2,return_sequences=True,return_state=True)(inputs1)
lstm2 = LSTM(2)(lstm1)
model = Model(input = inputs1,outputs = [lstm2]) print(model.predict(data))

输出为:最后一层的最后一个步长的隐藏状态。

[[-0.01998264 -0.00451741]]

本文参考自:

https://www.jianshu.com/p/a3f3033a7379

https://blog.csdn.net/qq_33472765/article/details/86561245

https://www.wandouip.com/t5i152855/

https://blog.csdn.net/weixin_36541072/article/details/53786020

Keras代码超详细讲解LSTM实现细节的更多相关文章

  1. bootStrap-table服务器端后台分页的使用,以及自定义搜索框的实现,前端代码到数据查询超详细讲解

    关于分页,之前一直纯手写js代码来实现,最近又需要用到分页,找了好多最终确定bootstrap-table,正好前端页面用的是bootstrap. 首先下载BootStrap-table的js和CSS ...

  2. 【Java面试题】15 String s="Hello"; s=s+“world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?String与StringBuffer的超详细讲解!!!!!

    1.Java中哪些类是不能被继承的? 不能被继承的是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在java中,System,Str ...

  3. 教你用webpack搭一个vue脚手架[超详细讲解和注释!]

    1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...

  4. 教你用webpack搭一个vue脚手架[超详细讲解和注释!](转载)

    1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...

  5. Python与Javascript相互调用超详细讲解(2022年1月最新)(三)基本原理Part 3 - 通过C/C++联通

    目录 TL; DR python调javascript javascript调python 原理 基于Node.js的javascript调用python 从Node调用python函数 V8 嵌入P ...

  6. Python与Javascript相互调用超详细讲解(四)使用PyNode进行Python与Node.js相互调用项(cai)目(keng)实(jing)践(yan)

    目录 前提 安装 使用 const pynode = require('@fridgerator/pynode')的时候动态链接错误 ImportError: math.cpython-39-x86_ ...

  7. freemaker超详细 讲解 配置

    一.FreeMarker简介 二.第一个FreeMark示例 2.1.新建一个Maven项目 2.2.添加依赖 2.3.添加存放模板的文件夹 2.4.添加模板 2.5.解析模板 2.6.运行结果 三. ...

  8. 以面向对象的思想实现数据表的添加和查询,JDBC代码超详细

    以面向对象的思想编写JDBC程序,实现使用java程序向数据表中添加学生信息,并且可以实现给定身份证号查询学生信息或给定准考证号查询学生信息. 创建的数据表如下: CREATE TABLE EXAMS ...

  9. 前端模块化IIFE,commonjs,AMD,UMD,ES6 Module规范超详细讲解

    目录 为什么前端需要模块化 什么是模块 是什么IIFE 举个栗子 模块化标准 Commonjs 特征 IIFE中的例子用commonjs实现 AMD和RequireJS 如何定义一个模块 如何在入口文 ...

随机推荐

  1. 【CSS】Table样式

    一.table td的宽度详解 Table只有Table的宽度是可以设置的,并且各个浏览器理解一致 原则上应该将table的宽度设置成一个固定的值,而不应该设置成一个根据屏幕变化的值 Table的宽度 ...

  2. Hdu 2157 How many ways??(DP||矩阵乘法)

    How many ways?? Time Limit:1000 MS Memory Limit: 32768 K Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, ...

  3. vue+elementui搭建后台管理界面(5递归生成侧栏路由)

    有一个菜单树,顶层菜单下面有多个子菜单,子菜单下还有子菜单... 这时候就要用递归处理 1 定义多级菜单 修改 src/router/index.js 的 / 路由 { path: '/', redi ...

  4. postgresql 字段sql语句 更改表名

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/sq8706/article/detail ...

  5. Python ( )、[ ]、{}的区别

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ },分别用来代表不同的python基本内置数据类型. python中的小括号( ):代表tuple元组数据 ...

  6. Unity3D ACT动作游戏《武士2》项目源码附教程

    武士二源码亲测unity2018.3.6能运行 仅供学习附有教程 教程完整73课,网上大部分一般为65课, 教程大小27GB,mp4格式 整理不易 扫码时备注或说明中留下邮箱 付款后如未回复请至htt ...

  7. spring线程池的同步和异步(1)

    spring线程池(同步.异步) 一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent ...

  8. python+opencv图像变换的两种方法cv2.warpAffine和cv2.warpPerspective

    本文链接:https://blog.csdn.net/qq_27261889/article/details/80720359 # usr/bin/env python # coding: utf- ...

  9. JS Array.apply会有内存泄漏问题

    报错内容: Maximum call stack size exceeded 参考:https://www.jianshu.com/p/b9ba0ddd3392 对象较多,前端JS内存溢出: 数组克隆 ...

  10. Acunetix Web Vulnerability Scanner abbr. AWVS

    awvs 中文手册详细版 - 木讷 - 博客园https://www.cnblogs.com/iamver/p/7124718.html Download Acunetix Trialhttps:// ...