使用Keras实现 基于注意力机制(Attention)的 LSTM 时间序列预测

时隔半年多,毕设男孩终于重操旧业,回到了LSTM进行时间序列预测和异常检测的路上。如果有阅读过我之前的博客,可以发现使用LSTM作单类的时间序列异常检测也是基于对于时间序列的预测进行登堂入室LSTM:使用LSTM进行简单的时间序列异常检测本次我们要进行的是使用注意力机制+LSTM进行时间序列预测,项目地址为KerasAttentionMechanism首先我们把它git…

大家好,又见面了,我是你们的朋友全栈君。

时隔半年多,毕设男孩终于重操旧业,回到了 LSTM进行时间序列预测和异常检测的路上。

如果有阅读过我之前的博客,可以发现使用 LSTM作单类的时间序列异常检测也是基于对于时间序列的预测进行 登堂入室LSTM:使用LSTM进行简单的时间序列异常检测

本次我们要进行的是 使用 注意力机制 + LSTM 进行时间序列预测,项目地址为Keras Attention Mechanism

对于时间步的注意力机制

首先我们把它git clone 到本地,然后配置好所需环境 笔者的 tensorflow版本为1.6.0 Keras 版本为 2.0.2
打开文件夹,我们主要需要的是attention_lstm.py 以及 attention_utils.py 脚本

项目中生成数据的函数为

def get_data_recurrent(n, time_steps, input_dim, attention_column=10):
    """ Data generation. x is purely random except that it's first value equals the target y. In practice, the network should learn that the target = x[attention_column]. Therefore, most of its attention should be focused on the value addressed by attention_column. :param n: the number of samples to retrieve. :param time_steps: the number of time steps of your series. :param input_dim: the number of dimensions of each element in the series. :param attention_column: the column linked to the target. Everything else is purely random. :return: x: model inputs, y: model targets """
    x = np.random.standard_normal(size=(n, time_steps, input_dim))
    y = np.random.randint(low=0, high=2, size=(n, 1))
    x[:, attention_column, :] = np.tile(y[:], (1, input_dim))
    return x, y

默认的 n = 30000, input_dim = 2 ,timesteps = 20。生成的数据为:

shape
x 30000 x 20 x 2
y 30000 x 1

其中 x 的第11个 timestep 两维的数据 与y相同,其他timestep 维的数据为随机数。

所以当我们使用这样的数据去进行 注意力机制 LSTM 的训练,我们希望得到的结果是 注意力层 主要关注第11个timestep 而对其他timestep 的关注度较低。

直接运行 attention_lstm.py 脚本
此时的网络结构为:
在这里插入图片描述
可以看到是在 LSTM 层之后使用了注意力机制

最后会汇总画一张图
在这里插入图片描述
可以看到 可以看到注意力的权重主要汇总在了第11个timestep,说明注意力机制很成功

对于维的注意力机制

上述的例子 是将注意力机制使用在了 timestep 上,决定哪个时间步对于结果的影响较大。
而如果我们想将 注意力机制使用在维上呢? 比如使用多维去预测一维的数据,我们想使用注意力机制
决定哪些维对于预测维起关键作用。

比较简单的方法就是将输入数据 reshape 一下 将timesteps 与 input_dim 维对换 再运行就可以了,因为本代码的设置就是对 输入的第2维加入注意力机制.

进阶的方法就是 自写一下 attention_3d_block 函数:

def attention_3d_block(inputs):
    # inputs.shape = (batch_size, time_steps, input_dim)
    input_dim = int(inputs.shape[2])
    a = inputs
    #a = Permute((2, 1))(inputs)
    #a = Reshape((input_dim, TIME_STEPS))(a) # this line is not useful. It's just to know which dimension is what.
    a = Dense(input_dim, activation='softmax')(a)
    if SINGLE_ATTENTION_VECTOR:
        a = Lambda(lambda x: K.mean(x, axis=1), name='dim_reduction')(a)
        a = RepeatVector(input_dim)(a)
    a_probs = Permute((1, 2), name='attention_vec')(a)
    #a_probs = a
    output_attention_mul = merge([inputs, a_probs], name='attention_mul', mode='mul')
    return output_attention_mul

其实严格来讲我们所做的改变不多,作者使用了 Permute层对于数据进行了 第2和第3维的对换,我们则没有进行对换操作。

接下来 再在attention_utils.py 脚本中写一个产生数据集的新函数:

def get_data_recurrent2(n, time_steps, input_dim, attention_dim=5):
    """ 假设 input_dim = 10 time_steps = 6 产生一个 x 6 x 10 的数据 其中每步的第 6 维 与 y相同 """
    x = np.random.standard_normal(size=(n, time_steps, input_dim))
    y = np.random.randint(low=0, high=2, size=(n, 1))
    x[:,:,attention_dim] =  np.tile(y[:], (1, time_steps))

    return x,y

试着产生一组数据 get_data_recurrent2(1,6,10)
在这里插入图片描述

然后我们稍微改动一下main函数进行新的训练。迭代十次后结果为:
在这里插入图片描述
可以看到,第6维的权重比较大。
如果我们对于timesteps的注意力画一个汇总图,即改动一下

  attention_vector = np.mean(get_activations(m, testing_inputs_1,print_shape_only=False,layer_name='attention_vec')[0], axis=2).squeeze()

可以看到对于timesteps的注意力是相同的(其实如果对于开头时间步的注意力机制,对输入维的注意力画一个汇总图,也是相同的)
在这里插入图片描述

对于时间步和输入维的注意力机制

待补充

注:参考 keras-attention-mechanism
以及 Keras中文文档

代码已上传到我的github

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125920.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mongodb服务启动失败_mongodb启动不了

    mongodb服务启动失败_mongodb启动不了在操作前需要启动mongodb数据库服务1.首先打开dos窗口,然后选择路径到你的安装路径下的bin目录(我的路径是的D:mongo\mongodb\bin)2.然后输入启动命令(D:mongo\data\db是我的数据库文件的目录前边两个–不能少)mongod–dbpathD:mongo\data\db3.回车dos界面出现12701的字样说明服务启动成功了如…

  • pycharm升级pip版本_怎么升级pip版本

    pycharm升级pip版本_怎么升级pip版本python-mpipinstall–upgradepip

    2022年10月23日
  • ftp扫描软件_ftp管理工具

    ftp扫描软件_ftp管理工具ftp扫描工具种类繁多,使用者就会在五花八门的软件里面去挑选自己最喜欢最适合的软件去使用。就是不知道大家是怎么选择的,小编的选择方式特别简单,就是好用的就成,简单快捷方便明了就可以了。所以要在这么多的扫描工具中去选择,该怎么去选择适合自己的ftp扫描软件呢?这边给你们整理了几个好用的ftp扫描工具。第一款:IIS7服务器管理工具这款软件里面的ftp扫描工具可谓是做的非常好的,内容全面又容易上手。适合新手也适合长期从事网站管理的工作人员。IIS7服务器管理工具里面的ftp扫描工具不仅具有批量管理的功能,还

  • 大数据运维面试题整理

    大数据运维面试题整理HDFS总结:1、HDFS是如何解决大规模数据的存储和管理的2、HDFS的架构原理和各核心组件的作用及关系3、HDFS文件系统数据的读写流程4、HDFS的HA的架构原理及核心5、HDFS的Federation机制6、HDSF的HA和Federation的区别…

  • thinkphp3.2.2邮箱发送

    thinkphp3.2.2邮箱发送

  • 深度解析xxl-rpc之RPC原理

    深度解析xxl-rpc之RPC原理一.什么是RPC?RPC(remoteprocesscall),中文是远程过程调用的意思。怎么理解这个远程过程调用呢?可以这样理解,可以与本地的过程调用对比下,本地过程调用,也就是调用函数或者是调用方法,比如说,在单体架构中,我们要根据用户的id获取订单信息,我们就需要找到订单service,调用getOrderInfoById(Stringid)这个方法,这个调用动作这就是本地过程调…

    2022年10月31日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号