前言

关于深度学习的算法,主要有CNN卷积神经网络、RNN循环神经网络、CAN生成对抗网络三种。LSTM(Long Short-Term Memory)就是基于RNN而来。本文将主要介绍LSTM的基础理论与文字预测的实例。

LSTM基础理论

1.基础框架图

其中的符号含义如下图所示:

2.分步解析

第一步,处理单元通过遗忘门来决定我们需要丢弃的信息。该门会读取h_{t-1}时刻向量值与x_{t}时刻的输入,然后通过激活层 σ 输出一个0-1之间数值(激活层函数一般为ReLU)。1表示“完全保留”,0表示“完全舍弃”。

f_{t} 为 σ网络激活层;  W_{f} 为 权重 ; h_{t-1},x_{t}为 输入; b_{f}为 偏执量;

第二步,这一步要确定什么样信息放到处理单元中,包含两个处理步骤:

1.首先:通过h_{t-1}时刻向量值与x_{t}时刻的输入然后通过 σ 网络激活层 决定哪些信息要更新,最终放入传送带。
2. 然后:通过tanh层,通过tanh层生成一个向量,对输入端进行激活,对细胞进行更新将C_{t-1}更新为\widetilde{C}_{t}

 第三步:现在是更新旧处理单元的时间了,C_{t-1} 更新为 C_{t}。把旧状态C_{t-1}与 f_{t}相乘,丢弃掉我们确定需要丢弃的信息。接着加上 i_{t}\ast \widetilde{C}_{t}。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。

最后,需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

单词预测实例

基于pytorch

import torch
import torch.nn as nn
import numpy as np
from torch.utils.data import DataLoader, Datasetclass Net(nn.Module):def __init__(self, features, hidden_size):super(Net, self).__init__()self.features = features  # 输入特征维度self.hidden_size = hidden_size  # 输出特征维度self.lstm = nn.LSTM(features, hidden_size)self.fc = nn.Linear(hidden_size, features)  # 全连接输出为语料库大小self.criterion = torch.nn.CrossEntropyLoss()def forward(self, x, y):# x.shape = [batch_size ,  seq_len , embedding_size] -> [seq_len , batch_size , embedding_size]# torch.nn.LSTM(input,(h_0,c_0)) API里面规定输入格式是(seq_len,batch,input_size)x = x.permute(1, 0, 2)  # [seq_len , batch_size , embedding_size]output, (_, _) = self.lstm(x.float())  # output.size -> [seq_len,batch_size,hidden_size]output = output[-1]  # output[-1].size -> [batch_size,hidden_size]output = self.fc(output)pred = torch.argmax(output, 1)  # 输出预测值loss = self.criterion(output, y)  # 输出损失值return pred, lossclass my_dataset(Dataset):def __init__(self, input_data, target_data):self.input_data = input_dataself.target_data = target_datadef __getitem__(self, index):return self.input_data[index], self.target_data[index]def __len__(self):return self.input_data.size(0)def make_data():vocab = [i for i in "abcdefghijklmnopqrstuvwxyz"]idx2word = {i: j for i, j in enumerate(vocab)}word2idx = {j: i for i, j in enumerate(vocab)}seq_data = ['make', 'need', 'coal', 'word', 'love', 'hate', 'live', 'home', 'hash', 'star','keep']V = len(word2idx)input_data = []target_data = []for seq in seq_data:input = [word2idx[n] for n in seq[:-1]]  # 'm', 'a' , 'k' is inputtarget = word2idx[seq[-1]]  # 'e' is targetinput_data.append(np.eye(V)[input])target_data.append(target)return torch.tensor(input_data), torch.LongTensor(target_data)def train():vocab = [i for i in "abcdefghijklmnopqrstuvwxyz"]idx2word = {i: j for i, j in enumerate(vocab)}word2idx = {j: i for i, j in enumerate(vocab)}input_data, target_data = make_data()tensor_dataset = my_dataset(input_data, target_data)batch_size = 4train_iter = torch.utils.data.DataLoader(tensor_dataset, batch_size, shuffle=True)n_hidden = 128net = Net(features=len(word2idx), hidden_size=n_hidden)optim = torch.optim.Adam(net.parameters(), lr=0.001)net.train()for i in range(1000):for input_data, target_data in train_iter:pred, loss = net(input_data, target_data)optim.zero_grad()loss.backward()optim.step()if i % 100 == 0:print("step {0} loss {1}".format(i, loss.float()))net.eval()for input_data, target_data in train_iter:pred, _ = net(input_data, target_data)for j in range(0,batch_size-1):pr_temp = ""for i in range(0,3):pr_temp += idx2word[np.argmax(input_data[j,i,:].numpy())]print(pr_temp+" ->   " + idx2word[pred.numpy()[j]])breakif __name__ == '__main__':train()

LSTM基础理论与实例相关推荐

  1. 递归神经网络LSTM原理——结合实例MATLAB实现

    最近正在看递归神经网络,看了网上很多博文,算是鱼龙混杂,并且基本都是使用Python实现,要不就是使用Matlab中的函数库等.对于使用Matlab的同学,甚为不方便.所以我将结合实例,使用matla ...

  2. 简单明了的LSTM/GRU应用实例(Tensorflow版)

    本文用一个简单的分类(Classification)任务来演示在Tensorflow中使用RNN的基本技巧.更确切地说是使用LSTM(你可以认为它是一种特殊的RNN).鉴于本文仅属于入门级教程,因此你 ...

  3. 基于LSTM的Chatbot实例(3) — tensorboard可视化分析LSTM

    一.LSTM 计算图 上一篇博文中已经完成了基于tensorflow的chatbot模型建立和训练,并保存训练日志在指定目录.在命令行使用"tensorboard –logdir='XXX' ...

  4. lstm需要优化的参数_LSTM的物理结构和一些细节

    海晨威:一幅图真正理解LSTM的物理结构​zhuanlan.zhihu.com 这个是网上看的最多的图了,但是在理解lstm的应用过程中的时候这个图带来了不少麻烦. 展开之后实际的物理结构是这样的,1 ...

  5. PyTorch实例2——文本情绪分类器

    实例主要用于熟悉相关模型,并且练习创建一个模型的步骤:数据收集.数据预处理.构建模型.训练模型.测试模型.观察模型表现.保存模型 传送门:蓝桥云课实验 目录 1. 实验环境 2. 实验目的 3. 相关 ...

  6. 漫谈数据仓库之维度建模

    2019独角兽企业重金招聘Python工程师标准>>> 0x00 前言 下面的内容,是笔者在学习和工作中的一些总结,其中概念性的内容大多来自书中,实践性的内容大多来自自己的工作和个人 ...

  7. 一文详解深度学习在命名实体识别(NER)中的应用

    近几年来,基于神经网络的深度学习方法在计算机视觉.语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展.在NLP的关键性基础任务-命名实体识别(Named Entity Recogni ...

  8. 当下电商究竟都适合从事那些项目,如何居家赚钱?

    如今生活压力越来越大,工作中也愈来愈难找,尤其是想找一个各层面都较为适合的也是十分困难,因而,很多人就挑选在家创业,那麼在家创业都做什么较为挣钱呢?1.纯做兼职假如你甘愿做一个收益平稳的女白领,何不先 ...

  9. 英特尔的Movidius AI加速技术适用于mini-PCIe版本,旨在加速神经网络

    文章来源:ATYUN AI平台 Aaeon公司推出了"UP AI Core"-- mini-PCIe版本的英特尔Movidius神经计算棒,用于神经网络加速,可用于UP Squar ...

最新文章

  1. 软件设计原则(三)里氏替换原则 -Liskov Substitution Principle
  2. 初识图机器学习(part1)--图的概述
  3. C语言 | 内存对齐01 - 什么是内存对齐
  4. linux tomcat PermGen space
  5. shell编程入门步步高(七、流程控制)
  6. 【Java NIO的深入研究5】字符集Charset
  7. java day28【多表查询 、事务 、DCL】
  8. 图神经网络:Graph Neural Networks
  9. echart制作环形图
  10. cd JAVA系统找不到指定路径_SDK Manager 打不开, 系统找不到指定路径 Unable to access jarfile lib\archquery.jar问题的解决办法...
  11. 23种设计模式:(一)创建者模型
  12. UG NX二次开发(C#)-装配-删除阵列矩阵
  13. 别再说自己不会了!2021年教你增加拿到BAT等大厂offer几率,醍醐灌顶!
  14. fread和fwrite
  15. ipad极品飞车无限狂飙无法连接服务器,极品飞车:无极限赛车总是显示无法连接网络...
  16. 前端入门之——html day2
  17. 长链剖分(知识点整理+板子总结)
  18. 让你用sublime写出最完美的python代码--windows环境
  19. OA软件如何打破信息孤岛,实现价值全面释放
  20. 关于隔离卡的安装系统出现无法转换

热门文章

  1. 异想维度 java_JAVA异常的最佳工程学实践探索
  2. 暴风科技暴涨之后或将一地鸡毛
  3. CSS-一些高级技巧 随学笔记
  4. 阿里云ECS服务器Linux下载安装RocketMQ以及管理控制台
  5. SymMover:帮windows下的软件和游戏好发无伤的“搬家”
  6. 全流程调度——Azkaban入门与进阶
  7. Android头像--拍照上传
  8. 分析师的嘴,骗人的鬼?年薪百万的券商分析师靠谱吗?Python量化大数据给你答案!| 邢不行
  9. Linux 启动qt 非法指令,交叉编译Qt 4.7时的“非法指令”
  10. 奈学DDD领域模型驱动设计