Keras代码超详细讲解LSTM实现细节
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实现细节的更多相关文章
- bootStrap-table服务器端后台分页的使用,以及自定义搜索框的实现,前端代码到数据查询超详细讲解
关于分页,之前一直纯手写js代码来实现,最近又需要用到分页,找了好多最终确定bootstrap-table,正好前端页面用的是bootstrap. 首先下载BootStrap-table的js和CSS ...
- 【Java面试题】15 String s="Hello"; s=s+“world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?String与StringBuffer的超详细讲解!!!!!
1.Java中哪些类是不能被继承的? 不能被继承的是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在java中,System,Str ...
- 教你用webpack搭一个vue脚手架[超详细讲解和注释!]
1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...
- 教你用webpack搭一个vue脚手架[超详细讲解和注释!](转载)
1.适用人群 1.对webpack知识有一定了解但不熟悉的同学. 2.女同学!!!(233333....) 2.目的 在自己对webpack有进一步了解的同时,也希望能帮到一些刚接触webpack的同 ...
- Python与Javascript相互调用超详细讲解(2022年1月最新)(三)基本原理Part 3 - 通过C/C++联通
目录 TL; DR python调javascript javascript调python 原理 基于Node.js的javascript调用python 从Node调用python函数 V8 嵌入P ...
- Python与Javascript相互调用超详细讲解(四)使用PyNode进行Python与Node.js相互调用项(cai)目(keng)实(jing)践(yan)
目录 前提 安装 使用 const pynode = require('@fridgerator/pynode')的时候动态链接错误 ImportError: math.cpython-39-x86_ ...
- freemaker超详细 讲解 配置
一.FreeMarker简介 二.第一个FreeMark示例 2.1.新建一个Maven项目 2.2.添加依赖 2.3.添加存放模板的文件夹 2.4.添加模板 2.5.解析模板 2.6.运行结果 三. ...
- 以面向对象的思想实现数据表的添加和查询,JDBC代码超详细
以面向对象的思想编写JDBC程序,实现使用java程序向数据表中添加学生信息,并且可以实现给定身份证号查询学生信息或给定准考证号查询学生信息. 创建的数据表如下: CREATE TABLE EXAMS ...
- 前端模块化IIFE,commonjs,AMD,UMD,ES6 Module规范超详细讲解
目录 为什么前端需要模块化 什么是模块 是什么IIFE 举个栗子 模块化标准 Commonjs 特征 IIFE中的例子用commonjs实现 AMD和RequireJS 如何定义一个模块 如何在入口文 ...
随机推荐
- [SCOI2016]妖怪
嘟嘟嘟 离NOI最后一周,把自己容易忘的知识点和板子复习一下. (刚答完loj的笔试模拟,感觉上不了90--) update:哦,我89-- 先把式子写出来,每一个妖怪的战斗力\(S(i) = A + ...
- 【转】Linux开机启动管理---systemd使用
常用命令 使某服务自动启动 systemctl enable httpd.service 使某服务不自动启动 systemctl disable httpd.service 检查服务状态 syste ...
- arch linux (manjaro) 下运行tim和qq
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/tim_install_wine 基于AUR的安装是没什么难度了, ...
- Pytest权威教程26-示例和自定义技巧
目录 示例和自定义技巧 返回: Pytest权威教程 示例和自定义技巧 这是一个(不断增长的)示例列表.如果你需要更多示例或有疑问,请联系我们.另请参阅包含许多示例代码段的 综合文档.此外,stack ...
- finnal关键字修饰
1.修饰变量,被赋值后不能被赋其他值,相当于常量 2.修饰方法,该方法不可以被子类重写,但可以重载 3.修饰类,修饰的类不可以被继承,如String,Math等
- Android中相对布局的两个控件
<Button android:id="@+id/button3" android:layout_width="wrap_content" android ...
- [树链剖分]BZOJ3589动态树
题目描述 别忘了这是一棵动态树, 每时每刻都是动态的. 小明要求你在这棵树上维护两种事件 事件0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 事件1: 小明希望你求出几条树枝上 ...
- postgresql 字段sql语句 更改表名
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/sq8706/article/detail ...
- cropper.js移动端使用
cropper.js移动端使用 一.总结 一句话总结: 启示:找对关键词,找对相关方面的应用,效果真的非常好 比如 cropper.js移动端使用,这样设置了(dragMode: 'move',//拖 ...
- GWAS这十年 | 10 Years of GWAS Discovery: Biology, Function, and Translation
相关文章: A Unified Framework for Association Analysis with Multiple Related Phenotypes 太重要了,不得不单独拿出来分析一 ...