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. 问题--Notepad++保存文件遇到Failed to save file

    一.问题如下 使用Notepad编码,保存时遇到问题:Failed to save file. Not enough space on disk to save file? 如下图所示: 二.解决方法 ...

  2. centos7磁盘分区、格式化、挂载

    1.分区:a. 查看磁盘分区表: # fdisk -l b. 查看指定磁盘分区表: # fdisk -l /dev/sdb c. 分区命令: fdisk /dev/sdb 常用命令: n:创建新分区 ...

  3. Navicat Premium连接MySQL 1251错误和Mysql初始化root密码和允许远程访问

    Mysql初始化root密码和允许远程访问 在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户是没有远程访问的权限. 下面介绍 ...

  4. nginx配置静态资源与动态访问分离【转】

    在前面的博客中<说说 NGINX 的配置及优化>的 2.5 小节里面,提到 location 模块是 nginx 中用的最多的,也是最重要的模块,负载均衡.反向代理.虚拟域名等都与它相关. ...

  5. sqlserver2016 kb补丁

    1. win2012r2 安装时 总是提示: 然后费了半天劲 下载下来又提示 找了一下 需要先安装这么一个补丁才可以 KB2919442 然后才能安装上 KB2919355 然后就可以正常安装了:

  6. Linux ps -ef vs. ps aux(ps -aux)

    ps aux.ps -aux.ps -ef之间的区别 - wynter_的博客 - CSDN博客 https://blog.csdn.net/wynter_/article/details/73825 ...

  7. VUE导入Excel

    import FilenameOption from './components/FilenameOption' import AutoWidthOption from './components/A ...

  8. [转]BigDecimal使用(整理)

    原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算.比如:货币 使用 ...

  9. (转)golang获取当前时间、时间戳和时间字符串及它们之间的相互转换

    原文连接: https://blog.csdn.net/skh2015java/article/details/70051512 1.获取当前时间 currentTime:=time.Now() // ...

  10. shell编程系列15--文本处理三剑客之awk格式化输出printf

    shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...