一、LSTM简介
LSTM是一种特殊的RNN,很好的解决了RNN中梯度消失的问题。LSTM的结构如下:
在LSTM中,有遗忘门、输入门、和输出门。LSTM在三维空间的结构如下:
详细的理论知识参见:循环神经网络RNN详细推导和LSTM(长短时间记忆模型)的详细推导。
二、主要函数
1、参数设置的理解:
这里主要指输入维度,输出维度、时间步长等参数的设置,如下:
#输入图片是28*28
n_inputs=28 #输入一行,一行有28个数据
max_time=28 #一共有28行
lstm_size=100 #隐藏层单元
n_classes=10 #10个分类
batch_size=50 #每个样本50个批次
- batch_size:这个参数其实和其他神经网络的batch_size意义相同,都指一次性输入到神经网络中的样本数。这里batch_size=50,含义是一次性将50个图像输入到LSTM中进行训练,完成一次误差反向传播和参数更新。
- n_steps:实际上指的是构造的LSTM总共有多少个时间上的输入。在这里取n_step = 28,指的是先后依次输入28次,一次输入的个数为batch_size * n_input。在MNIST数据集中,一幅图片表示为28*28的矩阵,因此如果一次输入1行,那么要先后依次输入28行才能将一个图片的信息完全输入。那么同时input_dim(在此处为n_inputs)的含义也很清楚了,就是一次输入的数据维数,在这里就是1行的数据个数。因此,输入端的操作是,在起始0时刻输入50幅图片的第1行,1时刻输入50幅图片的第2行。以此类推直到第28时刻输入最后1行。
- n_hidden:这个参数表示的是用于记忆和储存过去状态的节点个数。即使用n_hidden个节点表示隐含层状态。
- n_classes:这个参数的含义是输出结果维数。在MNIST数据集中,由于做的是0~9的分类,所以输出维度自然是10。
2、张量维度的改变tf.reshape():
用于改变张量的维度,在卷积池化完成后,改变张量的维度用于全连接,定义如下:
tf.reshape(tensor, shape, name=None)
参数:
- tensor:输入的张量,即需要改变维度的张量;
- shape:需要的形状。
返回值:返回一个新的,大小为shape的张量。
程序示例:
import tensorflow as tf
x=[[[1,2]],[[7,8]],[[4,5]],[[6,9]]]
y=tf.reshape(x,[-1,4]) #-1:表示第一维信息由系统自己确定,这里是2
with tf.Session() as sess:
print((sess.run(y)))
#输出:
[[1 2 7 8]
[4 5 6 9]]
3、tf.contrib.rnn.BasicLSTMCell():
该函数是基础的LSTM循环网络单元(即:block)。将forget_bias(默认值:1)添加到忘记门的偏差(biases)中以便在训练开始时减少以往的比例(scale)。该神经元不允许单元裁剪(cell clipping),也不使用peep-hole连接,它是一个基本的LSTM神经元。想要更高级的模型可以使用:tf.nn.rnn_cell.LSTMCell。tf.contrib.rnn.BasicLSTMCell()函数定义如下:
##########当使用函数缺省参数时,函数的默认参数如下:
cell = tf.contrib.rnn.BasicLSTMCell(num_units, forget_bias=1.0, state_is_tuple=True,
activation=None, reuse=None,name=None,dtype=None)
tf.nn.rnn_cell.LSTMCell()函数定义:
tf.nn.rnn_cell.BasicLSTMCell(num_units, forget_bias=1.0, state_is_tuple=True,
act