精华内容
下载资源
问答
  • LSTM长短时记忆神经网络温度预测负荷
    2020-11-26 11:30:21

    这个应该也是能跑的,不过需要改动一些数据,就是在根据自己的需要对代码进行改动,改动之后是能够运行的,之前朋友做的这个,是用温度预测负荷的,用的长短时记忆神经网络(LSTM)来做的,我这里将他进行了改动,因为代码还在改进所以发一下他的代码,希望大家一起互相交流

    # 使用GPU运算,忽略AVX警告
    import os
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    # 加载数据分析常用库
    import pandas as pd
    import matplotlib.pyplot as plt
    from keras.models import Sequential
    from keras.layers import Dense, LSTM
    from pandas import read_csv
    from pandas import DataFrame
    from pandas import concat
    from sklearn.preprocessing import MinMaxScaler
    from math import sqrt
    from numpy import concatenate
    from sklearn.metrics import mean_squared_error
    from sklearn.utils.validation import check_array as check_arrays
    import tensorflow as tf
    import numpy as np
    from keras import backend as K
    
    from keras.layers import Input,Embedding,LSTM,Dense
    from keras.models import Model
    from keras import backend as K
    
    
    # 导入数据,包含头信息
    data = read_csv('D:/lyyc/data.csv', header=0, index_col=0)
    # 删掉不用的字段
    # dataset = dataset.drop('jh', axis=1) # 删掉第一行
    # df转array
    values = data.values
    
    #查看训练数据
    feature = ['load','temp']
    example = pd.read_csv('D:/lyyc/data.csv', names=feature)
    example.head(8)
    print(example.head(8))
    # 查看数据采集区的数据
    plt.figure(figsize=(24, 8)) #创建图形尺寸
    for i in range(2):
    	plt.subplot(2, 1, i+1)  #子图
    	plt.plot(example.values[:, i])
    	plt.title(feature[i], y=0.5, loc='right')
    plt.show()
    
    
    #将时间序列数据转化为监督学习数据
    # data:观测值序列,类型为列表或者二维的Numpy数组,必选参数
    # n_in:输入的滞后观测值数量(X)。值介于1..len(data)之间,可选参数,默认为1。
    # n_out:输出的观测值数量(y)。值介于0..len(data)-1之间,可选参数,默认为1。
    # dropnan:是否删除具有NaN值的行,类型为布尔值。可选参数,默认为True。
    def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
    	n_vars = 1 if type(data) is list else data.shape[1]
    	df = DataFrame(data)
    	cols, names = list(), list()
    	# input sequence (t-n, ... t-1) 输入序列
    	for i in range(n_in, 0, -1):
    		cols.append(df.shift(i))
    		names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
    	# forecast sequence (t, t+1, ... t+n) 预测序列
    	for i in range(0, n_out):
    		cols.append(df.shift(-i))
    		if i == 0:
    			names += [('var%d(t)' % (j+1)) for j in range(n_vars)]
    		else:
    			names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]
    	# put it all together 组合:将列名和数据拼接在一起
    	agg = concat(cols, axis=1)
    	agg.columns = names
    	# drop rows with NaN values 删除空行值
    	if dropnan:
    		agg.dropna(inplace=True)
    	return agg
    
    # 数据标准化,将数据归一化到0-1之间,无量纲化
    scaler = MinMaxScaler(feature_range=(0, 1))
    # scaled = scaler.fit_transform(values)
    scaled_data = scaler.fit_transform(example[['load','temp']].values)
    # 将时序数据转换为监督问题数据
    reframed = series_to_supervised(scaled_data, 1, 1)
    
    
    
    # 删除无用的label数据
    reframed.drop(reframed.columns[3:4], axis=1, inplace=True)
    reframed.head(8)
    print(reframed.head(8))
    print(reframed.info())
    reframed.head()
    
    # 数据集划分,选取前120个数据作为训练集,中间240个作为验证集,其余的作为测试集
    values = reframed.values
    train_days = 1200#12480
    valid_days = 240 #1440
    train = values[:train_days, :]
    valid = values[train_days:train_days+valid_days, :]
    test = values[train_days+valid_days:, :]
    train_X, train_y = train[:, :-1], train[:, -1]
    valid_X, valid_y = valid[:, :-1], valid[:, -1]
    test_X, test_y = test[:, :-1], test[:, -1]
    
    # reshape将数据集重构为符合LSTM要求的数据格式,即 [样本,时间步,特征]
    train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
    valid_X = valid_X.reshape((valid_X.shape[0], 1, valid_X.shape[1]))
    test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
    print(train_X.shape, train_y.shape, valid_X.shape, valid_y.shape, test_X.shape, test_y.shape)
    
    # LSTM模型
    model = Sequential()
    # 输入层有 1 个input,隐藏层有50个神经元
    #model.add(Dense(3, activation='linear', input_shape=(train_X.shape[1], train_X.shape[2])))
    model.add(LSTM(50, activation='relu', input_shape=(train_X.shape[1], train_X.shape[2])))
    #model.add(LSTM(32, input_dim=67, input_length=10, return_sequences=True))
    
    
    # 输出层有 1 个output
    model.add(Dense(1, activation='linear'))
    
    model.compile(loss='mean_squared_error', optimizer='adam')  #loss='mae'
    model.summary()
    
    # fit network
    history = model.fit(train_X, train_y, epochs=50, batch_size=32, validation_data=(valid_X, valid_y), verbose=2, shuffle=False)
    # plot history  即loss曲线
    plt.plot(history.history['loss'], label='train')
    plt.plot(history.history['val_loss'], label='valid')
    plt.legend()
    plt.show()
    
    # make a prediction 预测1
    plt.figure(figsize=(24, 8))
    train_predict = model.predict(train_X)
    valid_predict = model.predict(valid_X)
    test_predict = model.predict(test_X)
    plt.plot(values[:,0], c='b')
    plt.plot([x for x in train_predict], c='g')
    plt.plot([None for _ in train_predict] + [x for x in valid_predict], c='y')
    plt.plot([None for _ in train_predict] + [None for _ in valid_predict] + [x for x in test_predict], c='r')
    plt.show()
    
    # make a prediction 预测2
    yhat = model.predict(test_X)
    test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))
    # invert scaling for forecast 将预测y与当前时间的x组合
    inv_yhat = concatenate((yhat, test_X[:, 1:]), axis=1)
    inv_yhat = scaler.inverse_transform(inv_yhat)
    inv_yhat = inv_yhat[:, 0]
    # invert scaling for actual 将实际y与当前时间的x组合
    test_y = test_y.reshape(len(test_y), 1)
    inv_y = concatenate((test_y, test_X[:, 1:]), axis=1)
    inv_y = scaler.inverse_transform(inv_y)
    inv_y = inv_y[:, 0]
    
    inv_yhat1 = np.delete(inv_yhat,0, 0)
    inv_y1 = np.delete(inv_y, 46, 0)#比预测点数少2
    
    
    # calculate RMSE
    rmse = sqrt(mean_squared_error(inv_y1, inv_yhat1))
    print('Test RMSE: %.3f' % rmse)
    
    
    #计算绝对百分比误差mape
    import numpy as np
    
    def mean_absolute_percentage_error(y_true, y_pred):
    	y_true, y_pred = np.array(y_true), np.array(y_pred)
    	return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
    
    mape = mean_absolute_percentage_error(inv_y1, inv_yhat1)
    print('Test MAPE= %.3f ' % mape)
    
    #画图
    plt.figure(figsize=(24, 8))
    plt.plot(inv_yhat1, c='r') #预测数据
    plt.plot(inv_y1, c='b') #真实数据
    plt.show()
    #画图--误差曲线
    plt.figure(figsize=(24, 8))
    plt.plot((inv_yhat1-inv_y1)/inv_y1, c='b')
    plt.show()
    
    #提取出预测值与实际值
    import numpy as np
    # python list that is needed to be save in the csv file
    # data_list = test_predict
    # print(data_list)
    # convert list to array
    #预测值
    data_array = np.array(inv_yhat1)
    print(data_array)
    # saving...
    np.savetxt('predata.csv', data_array, delimiter=',')
    print('Finish saving csv file')
    #实际值
    data_array = np.array(inv_y1)
    print(data_array)
    # saving...
    np.savetxt('actdata.csv', data_array, delimiter=',')
    print('Finish saving csv file')
    
    
    更多相关内容
  • 长短时记忆网络(Long Short Term Memory Network, LSTM),它有效地解决了原始循环神经网络(RNN)的缺陷,在语音识别、图片描述、自然语言处理等许多领域中成功应用。本文讲解由三个Gate(input、forget、output)和一...
  • 长短时记忆网络(Long Short Term Memory Network, LSTM),它有效地解决了原始循环神经网络(RNN)的缺陷,在语音识别、图片描述、自然语言处理等许多领域中成功应用。(LSTM-2)型引入了Ct,Ct-1记忆神经网络的影响...
  • #资源达人分享计划#
  • 长短时记忆神经网络(LSTM)

    千次阅读 多人点赞 2020-09-24 20:27:36
    下面为翻译文章,会稍有增删: ...循环神经网络 人类不会每秒都从头开始思考。 阅读本文,您会根据对先前单词的理解来理解每个单词。 您不会丢掉一切,重新从头开始思考。 传统的神经网络无法做到这一

    下面为翻译文章,会稍有增删:

    原文:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

    其他人的翻译:https://www.xiemingzhao.com/posts/eff2088e.html

    类似的文章:https://www.jianshu.com/p/8219ca28925e

    循环神经网络

    人类不会每秒都从头开始思考。 阅读本文时,您会根据对先前单词的理解来理解每个单词。 您不会丢掉一切,重新从头开始思考。 传统的神经网络无法做到这一点,这似乎是一个重大缺陷。 例如,假设您想对电影中每个点发生的事件进行分类。 尚不清楚传统的神经网络如何利用电影中先前事件的推理来告知后期事件。循环神经网络解决了这个问题。 它是具有循环的网络,可以使信息持久存在。

    图1 循环神经网络

    上面的循环神经网络,以 x t x_t xt 作为网络的输入,然后输出 h t h_t ht ,循环使得信息可以从当前步流动到下一步。

    这些循环使这个神经网络显得有些神秘。 但是,如果您再想一想,就会发现它们与普通的神经网络并没有什么不同。 循环神经网络可以看作是同一网络的多个副本,每个副本都将消息传递给后继者。 考虑一下如果展开循环会发生什么:

    在这里插入图片描述

    图2 展开的循环神经网络

    这种类似链的性质表明,循环神经网络与序列和列表密切相关。 它们是用于此类数据的神经网络的自然架构。

    在过去的几年中,将RNN应用到各种问题上已经取得了令人难以置信的成功:语音识别,语言建模,翻译,图像字幕…清单还在继续。 我将在Andrej Karpathy的出色博客文章 “The Unreasonable Effectiveness of Recurrent Neural Networks” 中讨论使用RNN可以实现的惊人成就。 但是它们确实非常惊人。

    这些成功的关键是使用“ LSTM”,这是一种非常特殊的循环神经网络,在许多任务上都能比标准版本好得多。 几乎所有令人兴奋的结果都是利用循环神经网络实现的。 本文将探讨的是这些LSTM

    长时依赖问题

    RNNs有吸引力的一个地方是它可以将先前的信息连接到当前的任务上,例如使用先前的视频帧可能会有助于对当前帧的理解。如果RNNs可以做到这一点,将变得十分有用,但是可以做到吗?

    有时,我们只需要查看最近的信息即可执行当前任务。 例如,考虑一种语言模型,该模型试图根据先前的单词预测下一个单词。 如果我们试图预测 “the clouds are in the sky” 的最后一个词,那么我们不需要任何进一步的上下文——很明显,下一个词将是“sky”。 在这种情况下,相关信息与所需信息之间的距离很小,RNN可以学习使用过去的信息。

    在这里插入图片描述

    图3

    但是这里也存在一些需要更多上下文信息的情况。想一下如果我们想要预测最后一个单词 “I grew up in France… I speak fluent French.” 从最近的信息来看,要预测的单词应该是一种语言的名字,但是要确定是那种语言,我们需要更前面单词 “France” 的上下文信息。这说明相关信息与当前任务的距离可能非常远。

    在这里插入图片描述

    图4

    从理论上来说,RNNs完全有能力处理这样的长时依赖,人类可以仔细的选择参数以解决这类简单问题。不幸的是,在实践中,RNNs看起来并没有能力处理他们。Hochreiter(1991)[German]Bengio, et al. (1994)等人对此问题进行了深入探讨,发现了处理这类问题变困难的根本原因。

    谢天谢地,LSTMs没有这个问题。

    LSTM网络

    长短时记忆神经网络(Long Short Term networks),通常叫做LSTMs,是一种能够捕捉长时依赖的特殊循环神经网络。它们由Hochreiter & Schmidhuber (1997) 提出,然后被许多人在后来的工作中进行精炼和推广。他们的工作在各种问题上表现都非常好,现在也被广泛使用。

    LSTMs是专门设计用来避免长时依赖问题的。长时间的记住信息已经成为了它的默认行为,不需要专门去学习。

    所有的LSTMs都有重复神经网络模块的链式形式。在标准的RNNs中,这个重复的模块可以是非常简单的结构,例如单个tanh层。

    在这里插入图片描述

    图5 包含单个tanh层的标准RNN重复模块

    LSTMs同样也有类似的链式结构,但是重复的模块有不同的结构。不是只有一个神经网络层,而是四个,以一种非常特殊的方式进行交互。

    在这里插入图片描述

    图6 包含四个交互层的LSTM重复模块

    不需要担心在模型中计算的细节。我们之后将一步步浏览整个LSTM网络。现在先来熟悉一下将要使用到的符号表示。

    在这里插入图片描述

    图7 网络中的符号含义
    1. 神经网络层(用于学习)
    2. 逐点操作(逐点相乘、逐点相加)
    3. 向量转移(向量沿箭头方向移动)
    4. 连接(将两个向量连接在一起)
    5. 复制(将向量复制为两份)
    LSTMs背后的核心思想

    LSTMs的关键是细胞状态(cell state),水平的线贯穿图的顶部。细胞状态就像一个传送带,它沿整个链条一直沿直线延伸,只有一些较小的线性相互作用。 信息不加改变地流动非常容易。

    在这里插入图片描述

    图8

    LSTM有能力向细胞状态添加或者移除信息,这些操作由门(gate)结构来精细调控。门结构是一种让信息有选择通过的方式。他们由一个sigmoid神经网络层和一个点乘操作构成。

    在这里插入图片描述

    图9

    sigmoid层输出的数据在0-1之间,表示每一个组件应该通过多少信息。如果为0则表示任何信息都无法通过,如果为1则表示所有信息都可以通过。

    一个LSTM有三个这样的门来保护和控制细胞状态。

    一步步看LSTM

    LSTM的第一个步骤是决定需要从细胞状态中丢弃哪些信息。这个是由一个sigmoid层也叫做遗忘门(forget gate)来决定的。它输入 h t − 1 h_{t-1} ht1 x t x_t xt ,然后经过sigmoid层后,得到0-1之间的输出 f t f_t ft 。之后跟细胞状态 C t − 1 C_{t-1} Ct1 逐点相乘。如果 f t f_t ft 对应的值为0,则丢弃对应的信息,反之,则保留对应的信息。

    在这里插入图片描述

    图10

    解释一下:

    C t − 1 C_{t-1} Ct1 是上一时刻的细胞状态

    h t − 1 h_{t-1} ht1 是上一时刻的模块输出

    σ \sigma σ 代表sigmoid层,每一个数据都需要经过sigmoid函数

    f t f_t ft 代表遗忘门的输出

    W f W_f Wf 代表权重矩阵

    b f b_f bf 代表偏置

    [ h t − 1 , x t ] [h_{t-1},x_t] [ht1,xt] 代表将两个矩阵拼接在一起

    LSTM的下一个步骤是要决定将哪些信息存储在细胞状态中,这包含两个部分:

    1.首先有一个sigmoid层叫做“输入门层”,它决定我们将更新哪些信息。

    2.下一步,一个tanh层创建候选值的向量, C ~ t \tilde{C}_t C~t ,决定哪些信息能够被加到细胞状态中

    接下来,我们将结合着两个部分对细胞状态进行更新。

    在这里插入图片描述

    图11

    现在我们来将细胞状态 C t − 1 C_{t-1} Ct1 更新为 C t C_t Ct

    我们先用旧的状态 C t − 1 C_{t-1} Ct1 对应点乘 f t f_t ft ,即 C t − 1 ∗ f t C_{t-1} * f_t Ct1ft ,用来丢弃我们已经决定要遗忘的信息,然后再加上 i t ∗ C ~ t i_t * \tilde{C}_t itC~t ,最终构成细胞状态 C t C_t Ct 。这是新的候选值,根据我们决定更新每个状态值的大小来缩放。

    在这里插入图片描述

    图12

    最后我们需要决定我们的输出,输出取决于我们的细胞状态,但是应当是一个过滤的版本。首先,首先我们要运行一个sigmoid层来决定要输出细胞状态的哪些信息。然后将细胞状态通过tanh层然后乘以sigmoid层的输出,最后我们就可以输出我们想要输出的部分。

    在这里插入图片描述

    图12
    长短时记忆神经网络的变体

    我们到目前为止讨论的都是普通的长短时记忆神经网络。但是并不是所有的LSTMs都跟上面的一样。事实上,几乎每一个涉及到LSTMs的文章都使用了一些不同的版本。这些版本的区别很小,但是值得一提。

    其中一个受欢迎的LSTM变体,由Gers & Schmidhuber (2000)提出,添加了窥视孔连接,这意味着可以让门层看到细胞状态。

    在这里插入图片描述

    图13

    上面的图对每一个门都添加了窥视孔,但是很多文章都仅仅给一部分门窥视孔。

    另一个变体使用了双输入和输出门。与单独决定要遗忘或者添加一些信息不同,这个网络同时决定这两件事情。当我们要添加一些信息的时候,才会遗忘这个地方的信息;当我们要遗忘更旧信息的时候,才会在这个地方添加新值。这两句话看起来是在表述一个意思,但是仔细品品,又有些不一样的意味。

    在这里插入图片描述

    图14

    一个有些戏剧性的LSTM变体是门控循环单元(Gate Recurrent Unit,GRU)Cho, et al. (2014)。它结合了遗忘和输入门成为一个单一的“更新门”,它还结合了细胞状态和隐藏状态,并且做了一些其他的改变。最终的模型比标准的LSTM模型更简单,而且越来越受欢迎。

    在这里插入图片描述

    图15

    这里仅仅只有一些值得注意的LSTM变体。还有许多其他的例如:Depth Gated RNNs by Yao, et al. (2015) 。同样也有完全不同的方法去解决长时依赖,像Clockwork RNNs by Koutnik, et al. (2014)

    这些LSTM变体中那个是最好的?差异重要吗?Greff, et al. (2015) 对受欢迎的变体做了一个比较,发现他们都是一样的。Jozefowicz, et al. (2015) 测试了超过一万个RNN结构,发现一些RNN在特定任务上表现要比LSTMs更好。

    总结

    之前,我提到了人们使用RNN所取得的非凡成就。基本上所有这些都是使用LSTM实现的。对于大多数任务,它们确实工作得更好!

    写成一组方程式,LSTM看起来很吓人。希望本文逐步介绍它们,使他们变得更加平易近人。

    LSTM是我们可以使用RNN完成的重要一步。很自然地想:还有另外一个大步吗?研究人员普遍认为:“是的!有下一步,Attention!”这个想法是让RNN的每一步都从更大的信息集合中选择信息。例如,如果您使用RNN创建描述图像的标题,则它可能会选择图像的一部分以查看其输出的每个单词。实际上,Xu, et al. (2015) 正是这样做的-如果您想探索Attention,这可能是一个有趣的起点!Attention取得了许多令人振奋的结果,而且似乎还有很多其他的任务……

    Attention不仅仅是RNN研究中唯一令人兴奋的话题。例如,Grid LSTMs by Kalchbrenner, et al. (2015) 看起来更具有前途。将RNNs用于生成模型中也十分有趣,例如: Gregor, et al. (2015), Chung, et al. (2015), 以及 Bayer & Osendorfer (2015) 。最近几年对于递归神经网络来说是一个令人振奋的时刻,而即将到来的几年有望如此!

    致谢

    展开全文
  • 提出一种考虑温度模糊化的多层长短时记忆神经网络(ML-LSTM)短期负荷预测方法。利用隶属度函数将预测时刻的温度和当日的平均温度进行模糊化处理,减小夏季温度波动性对负荷预测的影响;建立含3层隐藏层的长短时记忆...
  • 人工智能之长短时记忆神经网络(LSTM)前言:人工智能机器学习有关算法内容,请参见公众号“科技优化生活”之前相关文章。人工智能之机器学习主要有三大类:1)分类;2)回归;3)聚类。今天我们重点探讨一下长短时记忆神经...

    人工智能之长短时记忆神经网络(LSTM)

    前言:人工智能机器学习有关算法内容,请参见公众号“科技优化生活”之前相关文章。人工智能之机器学习主要有三大类:1)分类;2)回归;3)聚类。今天我们重点探讨一下长短时记忆神经网络(LSTM)算法。 ^_^

    通过上一篇文章[人工智能之循环神经网络(RNN)] 介绍,我们知道,RNN是一类功能强大的人工神经网络算法,RNN一个重要的优点在于,其能够在输入和输出序列之间的映射过程中利用上下文相关信息。但是RNN存在着梯度消失或梯度爆炸等问题。因此,为了解决上述问题,长短时记忆神经网络(LSTM)诞生了。

    长短期记忆神经网络LSTM是一种特殊的RNN,能够学习长期依赖关系。由Hochreiter和Schmidhuber (1997)提出,在后期工作中又由许多人进行了调整和普及(除了原始作者之外,许多人为现代LSTM做出了贡献,不完全统计:Felix Gers(目前在谷歌的DeepMind任职), Fred Cummins, Santiago Fernandez, Felix Gers(发明了LSTM遗忘门),Justin Bayer(自动演化), Daan Wierstra, Julian Togelius, Faustian Gomez, Matteo Gagliolo 和 Alex Graves)。LSTM在大量问题上效果异常出色,现在正在广泛使用。

    LTSM概念:

    长短时记忆神经网络LSTM(Long Short–Term Memory)是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。

    与其说长短时记忆神经网络LSTM是一种循环神经网络,倒不如说是一个加强版的组件被放在了循环神经网络中。具体地说,就是把循环神经网络中隐含层的小圆圈换成长短时记忆的模块,如下图所示。

    LTSM本质:

    LSTM引入自循环的巧妙构思,以产生梯度长时间持续流动的路径是初始LSTM模型的核心贡献。其中一个关键扩展是使自循环的权重视上下文而定,而不是固定的。门控此自循环(由另一个隐藏单元控制)的权重,累积的时间尺度可以动态地改变。

    LSTM循环网络除了外部的RNN循环外,还具有内部的LSTM细胞循环(自环)。

    LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力。

    LSTM原理:

    LSTM区别于RNN的地方,主要就在于它在算法中加入了一个判断信息有用与否的“处理器”,这个处理器作用的结构被称为cell。

    一个cell当中被放置了三扇门,分别叫做输入门、遗忘门和输出门。一个信息进入LSTM的网络当中,可以根据规则来判断是否有用。只有符合算法认证的信息才会留下,不符的信息则通过遗忘门被遗忘。

    说起来无非就是一进二出的工作原理,却可以在反复运算下解决神经网络中长期存在的大问题。目前已经证明,LSTM是解决长序依赖问题的有效技术,并且这种技术的普适性非常高,导致带来的可能性变化非常多。各研究者根据LSTM纷纷提出了自己的变量版本,这就让LSTM可以处理千变万化的垂直问题。

    LSTM深度剖析:

    LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。其包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。

    Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!

    LSTM 拥有三个门(输入门,遗忘门,输出门),来保护和控制细胞状态。

    标准LSTM:

    1)决定丢弃信息:

    2)确定更新的信息:

    3)更新细胞状态:

    4)输出信息:

    LSTM的变体:

    1)peephole 连接:

    2)coupled 忘记门和输入门:

    3) GRU(Gated Recurrent Unit):

    LSTM应用场景:

    LSTM已经在科技领域有了多种应用。基于LSTM的系统可以学习翻译语言、控制机器人、图像分析、文档摘要、语音识别、图像识别、手写识别、控制聊天机器人、预测疾病、点击率和股票、合成音乐等任务。

    2015 年谷歌通过基于CTC 训练的 LSTM 程序大幅提升了安卓手机和其他设备中语音识别的能力。百度也使用了 CTC;苹果的 iPhone 在 QucikType 和 Siri 中使用了LSTM;微软不仅将LSTM 用于语音识别,还将这一技术用于虚拟对话形象生成和编写程序代码等。亚马逊 Alexa 通过双向LSTM在家中与用户交流,而谷歌使用 LSTM 的范围更加广泛,它可以生成图像字幕,自动回复电子邮件,它包含在新的智能助手Allo中,也显著地提高了谷歌翻译的质量。目前,谷歌数据中心的很大一部分计算资源现在都在执行 LSTM 任务。

    结语:

    长短期记忆网络LSTM是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM是使用RNN的一个飞跃。LSTM算法在人工智能之机器学习、翻译语言、控制机器人、图像分析、文档摘要、语音识别、图像识别、手写识别、控制聊天机器人、预测疾病、点击率和股票、合成音乐等领域有着广泛应用。

    ------以往文章推荐------

    ·        机器学习

    ·        深度学习

    ·        人工神经网络

    ·        决策树

    ·        随机森林

    ·        强化学习

    ·        迁移学习

    ·        遗传算法

    ·        朴素贝叶斯

    ·        支持向量机

    ·        蒙特卡罗方法

    ·马尔科夫模型

    ·Hopfield神经网络

    ·回归模型

    ·K邻近算法

    ·卷积神经网络

    ·受限玻尔兹曼机

    ·循环神经网络

    展开全文
  • 基于python3、tensorflow库的bilstm程序。双向长短时记忆网络。python文件。
  • 长短时记忆神经网络模型改进.pdf
  • 基于长短时记忆神经网络的鄱阳湖水位预测.pdf
  • 基于双向长短时记忆神经网络的句子分类.pdf
  • 基于长短时记忆神经网络的硬件木马检测.pdf
  • 基于长短时记忆神经网络的生猪价格预测模型.pdf
  • 基于长短时记忆神经网络的锌液温度预测模型.pdf
  • 基于卷积神经网络和长短时记忆神经网络的非特定人语音情感识别算法.pdf
  • 长短时记忆神经网络在卫星轨道预报中的研究.pdf
  • 深度学习-43:长短时记忆神经网络(LSTM)

    万次阅读 多人点赞 2018-10-14 00:31:09
    深度学习-43:长短时记忆神经网络(LSTM) 深度学习原理与实践(开源图书)-总目录 长短时记忆神经网络(Long Short-term Memory Networks,LSTM)是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由 Hochreiter &...

    深度学习-43:长短时记忆神经网络(LSTM)

    深度学习原理与实践(开源图书)-总目录, 构建知识谱系。

    长短时记忆神经网络(Long Short-term Memory Networks,LSTM)是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由 Hochreiter & Schmidhuber (1997) 提出,并在近期被 Alex Graves 进行了改良和推广。LSTM明确旨在避免长期依赖性问题。长时间记住信息实际上是他们的默认行为,而不是他们难以学习的东西!

    1 LSTM网络的创新

    • 循环神经网络(RNN)处理时间序列数据具有先天优势;
    • 循环神经网络(RNN)通过反向传播和梯度下降算法达到了纠正错误的能力,但未解决梯度消失问题;
    • 直到1997年,循环神经网络(RNN)引入了一个基于LSTM的架构后,梯度消失问题得以解决;
    • LSTM的架构中的单元相当于一个模拟计算机,显著提高了网络精度。

    2 LSTM网络的结构

    由于循环神经网络(Recurrent NN)算法的弊端在于,随着时间的流逝,网络层数的增多,会产生梯度消失或梯度爆炸等问题。LSTM最早由 Hochreiter & Schmidhuber 在1997年提出,设计初衷是希望能够解决神经网络中的长期依赖问题。LSTM记忆单元具有遗忘门、输入门和输出门,LSTM记忆单元拥有长短时记忆机制。

    2.1 时间序列数据

    常见的时间序列数据包括:语言模型、手写体识别、序列生成、机器翻译、语音、视频分析等。时间序列数据的样本间存在顺序关系,每个样本和它之前的样本存在关联;直白一点呢的表述也就是选择和决策参考了上一次的状态。RNN不仅能够处理序列的输入,也能得到序列的输出,这里的序列指的是向量序列。

    假设时间序列为: X { x 1 , x 2 , … , x N } X\{x_1, x_2, \ldots, x_N\} X{x1,x2,,xN}

    时间序列模型为: P ( X ) = ∏ i = 1 N P ( x i ∣ x 1 , … , x i − 1 ) P(X)=\prod_{i=1}^N{P(x_i|x_1,\ldots,x_{i-1})} P(X)=i=1NP(xix1,,xi1)

    根据输出和输入序列不同数量rnn可以有多种不同的结构,不同结构自然就有不同的引用场合。每个矩形是一个向量;箭头代表函数(例如矩阵乘法);红色的是输入向量;蓝色的是输出向量;绿色的是某一时间的RNN状态。如下图,

    • 函数问题(不是序列): 一个输入得到一个输出,未体现序列的特征,例如:图像分类场景。
    • 一到多: 给一个输入得到一系列输出,可用于生产图片描述的场景,例如:图像自动字幕,将一幅幅图像转化为句子输出。
    • 多到一: 给一系列输入得到一个输出,可用于文本情感分析,对一些列的文本输入进行分类,看是消极还是积极情感,例如:情感分类,将一个给定的句子分类为积极的情感或者负面的情感
    • 间隔多到多: 给一些列输入得到一系列输出,可用于翻译或聊天对话场景,对输入的文本转换成另外的文本,例如:机器翻译,RNN读入英语的句子,翻译出法语的句子
    • 同步多到多: 它是经典的rnn结构,前一输入的状态会带到下一个状态中,而且每个输入都会对应一个输出,例如:视频分类,我们需要给视频的每一帧打标签。

    时间序列数据输出和输入序列的几种模式,如下图说是。
    时间序列数据输出和输入序列的几种模式

    2.2 长期依赖问题

    对于看电影、写作或思考的场景来说,我们总会或多或少的记住前面的东西(短暂记忆或持久记忆),然后旧的记忆和新的记忆反复叠加,最终我们完成了电影、写作或思考之旅。例如,我们看章子怡的电影《无问西东》,我们可以根据已经发生的故事情节推测当前故事情节的可能情节;或者我们的大脑会把所有已经发生的故事串起来,在某一刹那我们的泪如雨下。

    传统的神经网络(串行的卷积网络)不能做到这一点,这似乎是一个主要的缺点。例如,假设您想要对电影中每个点发生的事件进行分类。目前尚不清楚传统神经网络如何利用其对电影中先前事件的推理来告知后者。循环神经网络解决了这个问题。它们是具有循环的网络,允许信息持续存在。由于独特的设计结构,LSTM特别适合于处理时序间隔和延迟非常长的任务,作为非线性模型,LSTM非常适合于构造更大型深度神经网络。

    1 短期依赖问题

    时序数据(文本、音频或视频等)任务中,多数情况需要很多的上下文联系(甚至常识知识)才能准确预测。考虑尝试预测文本中的最后一个词“我在法国长大…我说流利的法语。”。最近的信息表明,下一个词可能是一种语言的名称,但如果我们想缩小哪种语言,我们需要从更进一步的背景来看,法国的背景。相关信息与需要变得非常大的点之间的差距完全是可能的。不幸的是,随着差距的扩大,RNN无法学会连接信息。

    RNN的短期依赖示意图
    图像来源:colah blog

    2 长期依赖问题

    RNN的优势是能够将先前信息连接到当前任务。我们只需要查看最近的信息来执行当前任务。如果相关信息与所需地点之间的差距很小,RNN可以学习使用过去的信息。例如: 考虑一种语言模型,试图根据之前的单词预测下一个单词。如果我们试图预测“云在天空中”的最后一个词,我们不需要任何进一步的背景 - 很明显,下一个词将是天空。

    RNN的短期依赖示意图
    图像来源:colah blog

    2.3 模型的结构

    递归神经网络(Recurrent NN),它不仅能够完成简单地图像输入和事件输出行为,还能保持对世界的记忆(给不同信息分配的权重),以帮助改进自己的分类功能。循环神经网络(Recurrent NN)在很多自然语言处理项目中取得突破。循环神经网络(Recurrent NN)多采用反向传播时间(BPTT)算法。

    循环神经网络的架构
    图像来源:colah blog

    由于循环神经网络(Recurrent NN)算法的弊端在于,随着时间的流逝,网络层数的增多,会产生梯度消失或梯度爆炸等问题。LSTM最早由 Hochreiter & Schmidhuber 在1997年提出,设计初衷是希望能够解决神经网络中的长期依赖问题。

    1 LSTM记忆单元

    在检测完每个图像后,模型会输出一个标签,同时模型对世界的认识也会有所更新。

    LSTM的重复网络模块的结构则复杂很多,它实现了三个门计算,即遗忘门、输入门和输出门。每个门负责是事情不一样,遗忘门负责决定保留多少上一时刻的单元状态到当前时刻的单元状态;输入门负责决定保留多少当前时刻的输入到当前时刻的单元状态;输出门负责决定当前时刻的单元状态有多少输出。

    我们希望神经网络能学会如何更新自己的认识,这样神经网络就可以相对缓慢地更新它对世界的认识。添加遗忘机制。例如,如果某个场景结束了,模型就应该忘记当前场景的位置和时间,并且重置任何与该场景有关的信息;但是,如果某个人物在该场景中死亡了,那么模型应该继续记住该人物死亡的事实。因此,我们想要模型学习独立的的遗忘/记忆机制:当收到新的输入时,模型需要知道哪些认识应该保留以及哪些认识应该遗弃。

    添加保存机制。当模型看到新的图像时,它需要学习关于该图像的所有信息是否值得使用以及是否值得保存。因此当收到新的输入信息时,模型首先忘记所有它认为自己不再需要的长期信息。然后,再学习新输入信息的哪部分具有使用价值,并且将它们保存到长期记忆中。将长期记忆聚焦为工作记忆。最后,模型需要学习哪一部分的长期记忆能立刻发挥作用。模型并不是始终都在使用全部的长期记忆的,它只需要学习应该集中注意力于哪部分记忆。

    这就是长短期记忆网络。RNN在各个时间步中改写记忆的方式可以说是相当无序的,而LSTM改写自己记忆的方式是更加精确的:通过使用特定的学习机制来判断哪些信息需要记忆、哪些信息需要更新以及哪些信息需要特别注意。这有助于LSTM对信息进行长期跟踪。

    LSTM网络模型的架构
    图像来源:colah blog

    • 长期记忆 l t m t ltm_t ltmt通常被称为cell状态。
    • 工作记忆 w m t wm_t wmt通常被称为隐状态。它与普通RNN中的隐状态类似
    • 记忆向量 r e m e m b e r t remember_t remembert通常被称为记忆门(尽管记忆门中的1仍表示保留记忆,0仍表示忘记)
    • 保存向量 s a v e t save_t savet通常被称为输入门(因为它决定输入信息中需要保存到cell状态中的程度)
    • 关注向量 f o c u s t focus_t focust通常被称为输出门

    2.4 LSTM模型的训练

    LSTM的参数训练算法,依然是我们熟悉的反向传播算法。对于这类反向传播算法,它们遵循的流程都是类似,简单说来,主要有如下三个步骤:

    • 前向计算每个神经元的输出值。对于LSTM而言,依据前面介绍的流程,按部就班地分别计算出ft,it,ct,ot和st。
    • 确定优化目标函数。在训练早期,输出值和预期值会不一致,于是可计算每个神经元的误差项值,借此构造出损失函数。
    • 根据损失函数的梯度指引,更新网络权值参数。与传统RNN类似,LSTM误差项的反向传播包括两个层面:一个是空间上层面的,将误差项向网络的上一层传播。另一个是时间层面上的,沿时间反向传播,即从当前t时刻开始,计算每个时刻的误差。
    • 然后跳转第(1)步,重新做(1)、(2)和(3)步,直至网络误差小于给定值。

    3 LSTM网络的实现

    这里我们简单地来看看在tensorflow中是如何实现使用RNN来完成具体的任务的。示例中,使用了著名的MNIST Data数据集,采用所构建的RNN来进行分类。

    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    # set random seed for comparing the two result calculations
    tf.set_random_seed(1)
    mnist = input_data.read_data_sets('MNIST_data', one_hot=True)#从MNIST_data文件中读取数据
    
    #设置超参数
    lr = 0.001#学习率
    training_iters = 100000#训练的迭代次数
    batch_size = 128#批尺寸
    
    n_inputs = 28   # MNIST的输入数据是28*28的
    n_steps = 28    #迭代次数
    n_hidden_units = 128   # 隐藏层的神经元个数
    n_classes = 10      # MNIST分类,0-9的是个数字
    
    # tf图输入
    x = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
    y = tf.placeholder(tf.float32, [None, n_classes])
    
    # 权重的定义
    weights = {
        'in': tf.Variable(tf.random_normal([n_inputs, n_hidden_units])), # (28, 128)输入
        'out': tf.Variable(tf.random_normal([n_hidden_units, n_classes]))# (128, 10)输出
    }
    biases = {#偏执
        'in': tf.Variable(tf.constant(0.1, shape=[n_hidden_units, ])),# (128, )
        'out': tf.Variable(tf.constant(0.1, shape=[n_classes, ]))# (10, )分10类
    }
    
    
    def RNN(X, weights, biases):
        X = tf.reshape(X, [-1, n_inputs])
        X_in = tf.matmul(X, weights['in']) + biases['in']
        X_in = tf.reshape(X_in, [-1, n_steps, n_hidden_units])
        if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
            lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden_units, forget_bias=1.0, state_is_tuple=True)
        else:
            lstm_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units)
        init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
    
        outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in, initial_state=init_state, time_major=False)
    
        if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
            outputs = tf.unpack(tf.transpose(outputs, [1, 0, 2]))    # states is the last outputs
        else:
            outputs = tf.unstack(tf.transpose(outputs, [1,0,2]))
        results = tf.matmul(outputs[-1], weights['out']) + biases['out']    # shape = (128, 10)
    
        return results
    
    
    pred = RNN(x, weights, biases)
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
    train_op = tf.train.AdamOptimizer(lr).minimize(cost)
    
    correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
    
    with tf.Session() as sess:
        if int((tf.__version__).split('.')[1]) < 12 and int((tf.__version__).split('.')[0]) < 1:
            init = tf.initialize_all_variables()#解决老版本的兼容性问题
        else:
            init = tf.global_variables_initializer()#tensorflow版本 >= 0.12的情况
        sess.run(init)#初始化
        step = 0
        while step * batch_size < training_iters:#小于所设置的迭代次数的时候
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            batch_xs = batch_xs.reshape([batch_size, n_steps, n_inputs])
            sess.run([train_op], feed_dict={
                x: batch_xs,
                y: batch_ys,
            })
            if step % 20 == 0:
                print(sess.run(accuracy, feed_dict={
                x: batch_xs,
                y: batch_ys,
            }))
            step += 1
    

    4 LSTM网络的演进

    • 1997年, Hochreiter & Schmidhuber提出的Long Short-Term Memory(LSTM)
    • 2009年, 用改进版LSTM赢得ICDAR手写识别比赛冠军。
    • 2014年, Bengio团队提出了一种更加好用的LSTM变体GRU (Gated Recurrent Unit,门控环单元)
    • 2016年, 谷歌公司利用LSTM来做语音识别和文字翻译[7]。同年,
    • 2016年, 苹果公司使用LSTM来优化Siri应用。

    系列文章

    参考文献

    • [1] Ian Goodfellow, Yoshua Bengio. Deep Learning. MIT Press. 2016.
    • [2] 焦李成等. 深度学习、优化与识别. 清华大学出版社. 2017.
    • [3] 佩德罗·多明戈斯. 终极算法-机器学习和人工智能如何重塑世界. 中信出版社. 2018.
    • [4] 雷.库兹韦尔. 人工智能的未来-揭示人类思维的奥秘. 浙江人民出版社. 2016.
    • [5] 了解LSTM网络
    展开全文
  • 基于卷积长短时记忆神经网络的蛋白质二级结构预测.pdf
  • 基于深度长短时记忆神经网络模型的心律失常检测算法.pdf
  • 基于长短时记忆神经网络的手足口病发病趋势预测.pdf
  • 基于长短时记忆神经网络的锅炉多参数协同预测模型.pdf
  • 长短时记忆神经网路简介
  • 基于长短时记忆神经网络的风电机组滚动轴承故障诊断方法.pdf
  • 主成分分析和长短时记忆神经网络预测水产养殖水体溶解氧.pdf
  • 基于多模型长短时记忆神经网络的电力负荷预测方法研究.pdf
  • 对lstm长短时记忆神经网络的简单介绍,包括循环神经网络的基础知识,lstm的简介和用lstm预测正弦图像的实验。
  • 基于长短时记忆神经网络的回采工作面瓦斯浓度动态预测.pdf
  • 基于长短时记忆神经网络(LSTM)的降雨径流模拟及预报.pdf
  • 基于长短时记忆神经网络的辽东湾海冰延伸期预报方法研究.pdf
  • 基于粒子群优化算法和长短时记忆神经网络的蟹塘溶解氧预测.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,107
精华内容 2,042
关键字:

长短时记忆神经网络

友情链接: 未命名文件夹 2.zip