这篇博客前面原理部分是colah博客的翻译,后面一部分为自己结合实际实际代码的理解。
long short term memory,即我们所称呼的LSTM,是为了解决长期以来问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
不必担心这里的细节。我们会一步一步地剖析 LSTM 解析图。现在,我们先来熟悉一下图中使用的各种元素的图标。
在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
LSTM的关键在于细胞的状态整个(绿色的图表示的是一个cell),和穿过细胞的那条水平线。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
若只有上面的那条水平线是没办法实现添加或者删除信息的。而是通过一种叫做 门(gates) 的结构来实现的。
门 可以实现选择性地让信息通过,主要是通过一个 sigmoid 的神经层 和一个逐点相乘的操作来实现的。
sigmoid 层输出(是一个向量)的每个元素都是一个在 0 和 1 之间的实数,表示让对应信息通过的权重(或者占比)。比如, 0 表示“不让任何信息通过”, 1 表示“让所有信息通过”。
LSTM通过三个这样的本结构来实现信息的保护和控制。这三个门分别输入门、遗忘门和输出门。
现在我们就开始通过三个门逐步的了解LSTM的原理
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取 h t − 1 h t − 1 h t − 1 ht−1ht−1 h_{t-1} ht−1ht−1ht−1ht=(1−zt)∗ht−1+zt∗h^t
**多层LSTM是将LSTM进行叠加,其优点是能够在高层更抽象的表达特征,并且减少神经元的个数,增加识别准确率并且降低训练时间。**具体信息参考[3]
这里我们利用的数据集是tensorflow提供的一个手写数字数据集。该数据集是一个包含n张28*28的数据集。
# -*- coding: utf-8 -*-
import tensorflow as tf
from tensorflow.contrib import rnn
import numpy as np
import input_data
input_vec_size = lstm_size = 28 # 输入向量的维度
time_step_size = 28 # 循环层长度
batch_size = 128
test_size = 256
这里设置将batch_size设置为128,time_step_size表示的是lstm神经元的个数,这里设置为28个(和图片的尺寸有关?),input_vec_size表示一次输入的像素数。
def init_weights(shape):
return tf.Variable(tf.random_normal(shape, stddev=0.01))
def model(X, W, B, lstm_size):
# X, input shape: (batch_size, time_step_size, input_vec_size)
# XT shape: (time_step_size, batch_size, input_vec_size)
#对这一步操作还不是太理解,为什么需要将第一行和第二行置换
XT = tf.transpose(X, [1, 0, 2]) # permute time_step_size and batch_size,[28, 128, 28]
# XR shape: (time_step_size * batch_size, input_vec_size)
XR = tf.reshape(XT, [-1, lstm_size]) # each row has input for each lstm cell (lstm_size=input_vec_size)
# Each array shape: (batch_size, input_vec_size)
X_split = tf.split(XR, time_step_size, 0) # split them to time_step_size (28 arrays),shape = [(128, 28),(128, 28)...]
# Make lstm with lstm_size (each input vector size). num_units=lstm_size; forget_bias=1.0
lstm = rnn.BasicLSTMCell(lstm_size, forget_bias=1.0, state_is_tuple=True)
# Get lstm cell output, time_step_size (28) arrays with lstm_size output: (batch_size, lstm_size)
# rnn..static_rnn()的输出对应于每一个timestep,如果只关心最后一步的输出,取outputs[-1]即可
outputs, _states = rnn.static_rnn(lstm, X_split, dtype=tf.float32) # 时间序列上每个Cell的输出:[... shape=(128, 28)..]
# tanh activation
# Get the last output
return tf.matmul(outputs[-1], W) + B, lstm.state_size # State size to initialize the state
init_weigths函数利用正态分布随机生成参数的初始值,model的四个参数分别为:X为输入的数据,W表示的是28 * 10的权值(标签为0-9),B表示的是偏置,维度和W一样。这里首先将一批128*(28*28)的图片放进神经网络。然后进行相关的操作(注释已经写得很明白了,这里就不再赘述),然后利用WX+B求出预测结果,同时返回lstm的尺寸
py_x, state_size = model(X, W, B, lstm_size)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=py_x, labels=Y))
train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)
然后通过交叉熵计算误差,反复训练得到最优值。
源代码:
https://github.com/geroge-gao/deeplearning/tree/master/LSTM
[1].https://www.jianshu.com/p/9dc9f41f0b29
[2].http://blog.csdn.net/Jerr__y/article/details/58598296
[3].Stacked Long Short-Term Memory Networks
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet">
</div>
MATLAB中牛顿的方程组方法(Newton's Method for System of Equations in MATLAB)我试图用方程系统实现牛顿方法,但我认为它不能正常工作。 我应该获得[60 22.5 -60]度的角度,但现在我得到[995 90 -230]度。 有人能看出我的代码有什么问题吗?hold onl = 2;L1 = 1;L2 = 1;L3 = 1;m1 = 1;m2 =...
#ifndef KEY_H#define KEY_H#include "stm32f10x.h"#define KEY0 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)#define KEY3 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)#define KEY4 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)void key_init(void);#endif..
目录1、边框效果1)、圆角属性2)、边框阴影3)、文字阴影2、文字效果3、transform 属性4、图标字体5、动画6、响应式布局1、边框效果1)、圆角属性border-radius ,赋值顺序是上、右、下、左。<!DOCTYPE html><html> <head> <meta ch...
ps:记录一下实习中实际使用hive sql取数的一些心得和坑性能调优用group by 代替distinct去重,效率更高两个表连接时,把关联字段里更少的放前面,即小表left join 大表在内层做完集计或者筛选后再在外层连接效率会更高常犯错误case when时,else可以省略,end不可省略,但是else不省略的时候必须后面跟上一个值,不然就报错select后跟着的字段,最后一个字段后面不能加逗号...
今天在查询mysql列类型为varchar的数据时,发现无法区分大小写的查询结果,其中一种解决方式是在查询条件列前面加上binary:select 数据 from 表名 where 列名=查询字符串;select 数据 from 表名 where binary 列名=查询字符串;...
[url]http://www.ntu.edu.sg/home/assourav/crank.htm[/url][color=blue]AREA: Artificial Intelligence and Related Subjects[/color][color=red]Rank 1[/color]: AAAI: American Association for...
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。 样例 给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构: 3 ...
背景介绍分析为何无法生成主键信息?catalog从何而来?配置catalog后最终解决方案总结参考背景介绍在使用Mybatis自动生成代码功能时,出现提示Cannot obtain primary key information from the database, generated objects may be incomplete,导致Mapp...
今天换了台mac,不是m1芯片的,先用着吧!记录一下各个环境的镜像地址(很多国外的官网下载特别慢),方便以后下载。如果下载以后打不开往下拉。idea中文官网下载地址:点此下载华为云jdk11镜像:点此下载git镜像:点此下载镜像地址其实很多东西都可以直接去华为云搜:点此进入无法打开“xxx”,因为它来自身份不明的开发者。还是去系统偏好设置,找到安全性与隐私,在通用页面下面,会看到刚才拦截下来的文件,点打开就行了,我刚才已经点掉了快捷键修改不用去一个个设置快捷键。系统偏好设置
MOSAD_HW1介绍个人作业1-创建第一个XCode项目、面向对象与Objective-C语法学习开发环境Mac OSObjective-CXcodeTA check: 9月23日实验课或提前DeadLine: 10月7日23:59任务安装配置Mac OS和Xcode熟悉Mac OS按键操作熟悉Xcode项目结构,编译运行第一个Xcode项目,项目创建流程详见tutorial张三衣柜里有N(N>3)件上衣:白色T恤…M(M>4)条裤子:灰色沙滩裤…
计算矩形与圆形相交与否import javafx.scene.shape.Circle;import javafx.scene.shape.Rectangle;import java.math.BigDecimal;/** * 描述: 计算圆形与矩形之间图形相交工具类 * User: YueXZ * DateTime: 2021/12/8 17:22 * Version:1.0.0 */public class AreaMathUtil { public static B
大整数的存储struct bign{ int d[1000]; int len; bign(){ memset(d,0,sizeof(d)); len=0; }}; bign change(char str[]){ //将整数转换为bign bign a; a.len=strlen(str); //bign的长度就是字符串的长度 for(int i=0;i&l...